ошибка: «WlanScan» не был объявлен в этой области

Я играл с wlanapi в окнах. У меня не было проблем с компиляцией или запуском, пока я не попытался использовать функцию WlanScan. Затем я не смог скомпилировать из-за того, что «WlanScan» не был объявлен в области. Я написал очень короткую программу, иллюстрирующую это с помощью двух функций: WlanOpenHandle, который работает и WlanScan, которого нет.

#include <windows.h>
#include <wlanapi.h>

int main()
{
    HANDLE hClient;
    WlanOpenHandle(2, 0, 0, &hClient);

    WlanScan(hClient, 0, 0, 0, 0);
}

Компиляция этого единственного файла следующим образом:

g++ main.cpp -lwlanapi

Результаты в этой ошибке:

main.cpp: In function 'int main()':
main.cpp:9:30: error: 'WlanScan' was not declared in this scope
  WlanScan(hClient, 0, 0, 0, 0);
                              ^

Что может быть причиной этого? Мне удалось использовать несколько функций из файла wlanapi. Я компилирую Windows 7 с помощью minGW.

EDIT: В соответствии с тем, что сказал u/IInspectable, я изменил команду, используемую для компиляции, на:

g++ -D_WIN32_WINNT=_WIN32_WINNT_WIN7 main.cpp -lwlanapi

И это сработало!


person EFTH    schedule 15.08.2014    source источник
comment
Ваша функция main должна возвращать целое число.   -  person Thomas Matthews    schedule 15.08.2014
comment
@ThomasMatthews Верно, но это для следующего вопроса - не забегайте вперед. :)   -  person Forest Kunecke    schedule 16.08.2014
comment
@FKunecke Что ты имеешь в виду? Это С++, об этом позаботится компилятор.   -  person EFTH    schedule 16.08.2014
comment
Вы объявили функцию main() возвращающей int. Где ваш код соответствует декларации? В идеале вы должны указать возвращаемое значение для операционной системы, а не полагаться на компиляторы.   -  person Thomas Matthews    schedule 16.08.2014
comment
@ThomasMatthews Это может быть правдой. Но это не имеет отношения к моему вопросу.   -  person EFTH    schedule 16.08.2014
comment
@EFTH Я обновил свой ответ; Но мне любопытно - попробуйте просто добавить #pragma comment(lib, "wlanapi.lib") к вашему текущему коду и посмотреть, что произойдет.   -  person Forest Kunecke    schedule 16.08.2014
comment
@FKunecke Спасибо за помощь. Но добавление этой строки не помогло.   -  person EFTH    schedule 16.08.2014
comment
@EFTH выдавало ту же ошибку? Я не могу воспроизвести вашу проблему.   -  person Forest Kunecke    schedule 16.08.2014
comment
@FKunecke Да, та же ошибка. Я осмотрелся на своей машине и смог найти два файла wlanapi.h, оба из которых объявляют функцию   -  person EFTH    schedule 16.08.2014
comment
@ThomasMatthews: должно, но не обязательно (неявно return 0)   -  person quantdev    schedule 16.08.2014
comment
@ThomasMatthews: Что должен возвращать main() в C и C++?   -  person IInspectable    schedule 16.08.2014
comment
Убедитесь, что символ препроцессора _WIN32_WINNT установлен на _WIN32_WINNT_WINXP (или выше, например, _WIN32_WINNT_VISTA, _WIN32_WINNT_WIN7). Символ должен быть определен до включения файла заголовка <wlanapi.h>. Рекомендуется передавать его в командной строке компилятора.   -  person IInspectable    schedule 16.08.2014
comment
@IInspectable Спасибо! Это сработало. Я обновил вопрос, чтобы включить это решение. Если вы поместите это в реальный ответ, я могу отметить этот вопрос выполненным и обработанным.   -  person EFTH    schedule 17.08.2014


Ответы (1)


Похоже, у кого-то еще была эта проблема раньше:

Как скомпилировать C++ Код, имеющий зависимость от wlanapi.h и windows.h

Рекомендуемое решение — просто поместить его в Visual Studio и скомпилировать с его помощью; MinGW, вероятно, не может найти библиотеку.


Используя VS2010, я создал консольное приложение VC++ (с предварительно скомпилированным заголовком), и мне удалось скомпилировать следующее без каких-либо ошибок:

// wlanapi_Test.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"


int _tmain(int argc, _TCHAR* argv[])
{
    HANDLE hClient;
    WlanOpenHandle(2, 0, 0, &hClient);

    WlanScan(hClient, 0, 0, 0, 0);

}

И вот мой предварительно скомпилированный заголовок:

// stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently, but
// are changed infrequently
//

#pragma once

#include "targetver.h"

#include <stdio.h>
#include <tchar.h>



// TODO: reference additional headers your program requires here


#include <windows.h>
#include <wlanapi.h>

#pragma comment(lib, "wlanapi.lib")
person Forest Kunecke    schedule 15.08.2014
comment
Волшебство происходит внутри "targetver.h". Если вы не предоставите этот файл (который Visual Studio создала для вас автоматически), это никак не поможет ответить на вопрос. Кроме того, в вопросе указана ошибка компилятора (в отличие от ошибки компоновщика), так что это не имеет ничего общего с отсутствием библиотеки. - person IInspectable; 16.08.2014