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, до тех пор, пока я могу поместить все, что я использую, на флэш-диск и носить его с как можно меньшим раздражением, и что конечный результат не требует администрирования привилегии для запуска.

1

Решение

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

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

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

2

Другие решения

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

Сэм

1

По вопросам рекламы [email protected]