TDM-GCC вызывает ошибку: неопределенная ссылка на метод, который я никогда не вызывал

Это с компилятором, который поставляется с Dev-C++ при работе в Windows 7, "TDM-GCC 4.9.2 64-bit Release". То же самое происходит и с 64-битной версией. Параметр "добавить следующие флаги при вызове компоновщика" в "Параметры компилятора" имеет значение -static-libgcc -lws2_32и "добавить следующие флаги при вызове компилятора" std=c++11,

К сожалению, я не могу получить гораздо больше информации, чем это, потому что это очень, очень заблокированный компьютер.

Как только я вернусь домой, я проверю это там и отредактирую любую новую информацию.

Тестовый файл:

#include <windows.h>
#include <psapi.h>
#include <iostream>

int main() {
    HANDLE h = GetCurrentProcess();
    TCHAR name[100];
    GetProcessImageFileName(h, name, 100);
    std::cout << "Name is " << std::endl;
}

При компиляции выдает следующую ошибку:

C:\Users\[REDACTED]\AppData\Local\Temp\ccQz3L9P.o:test.cpp:(.text+0x2f): undefined reference to `GetProcessImageFileNameA'

Насколько я могу судить, это звонит GetProcessImageFileNameA вместо GetProcessImageFileName из-за #define в psapi.h:

#define GetProcessImageFileName __MINGW_NAME_AW(GetProcessImageFileName)

__MINGW_NAME_AW(func) является #defineд в _mingw_unicode.h как func##Aчто, если я правильно понимаю, откуда исходит имя нового метода.

Вернуться в psapi.h, DWORD WINAPI GetProcessImageFileNameA(HANDLE, LPSTR, DWORD); объявлен, но я нигде не нашел его определения, и Dev-C++ тоже не может. Я вполне уверен, что это проблема.

Как я могу это исправить? Я открыт для всего, вплоть до переключения компиляторов или IDE, до тех пор, пока я могу поместить все, что я использую, на флэш-диск и носить его с как можно меньшим раздражением, и что конечный результат не требует администрирования привилегии для запуска.

2 ответа

Решение

GetProcessImageFileName является функцией Windows API, и вам нужно связаться с нужной библиотекой, чтобы получить к ней доступ.

Он определяется как макрос GetProcessImageFileNameA или же GetProcessImageFileNameW в зависимости от того, компилируете ли вы "широкий" или "узкий".

Win32 API имеет Unicode и Ascii версии каждой функции (по крайней мере, функции, которые принимают строки). В общем, версия ascii преобразует символы в Unicode и вызывает другую имплантацию внутренне.

Вам нужно ссылку Psapi.lib или же Kernel32.lib в ваш проект. Я не уверен насчет вашего компилятора, но в VC++ вы добавляете #pragma comment(lib, "Psapi.Lib") в свой код или добавить Psapi.lib в дополнительных библиотеках свойств проекта.

Сэм

Другие вопросы по тегам