Visual Studio C++ ссылка с psapi.lib
Я написал программу на C, которая вызывает функцию GetModuleInformation(), которая определена в psapi.h
Я использую компилятор командной строки Microsoft Visual Studio C++ (cl.exe) для компиляции и компоновки программы.
Я включил заголовочный файл psapi.h:
#include <psapi.h>
когда я пытаюсь скомпилировать с помощью:
cl program.c
Он генерирует объектный файл, но завершается ошибкой на этапе компоновки с ошибкой:
program.obj : error LNK2019: unresolved external symbol _GetModuleInformation@16 ref
erenced in function _main
program.exe : fatal error LNK1120: 1 unresolved externalsprogram.obj : error LNK2019: unresolved external symbol _GetModuleInformation@16 ref
Я также помещаю файл psapi.lib в ту же папку, где находится файл исходного кода (program.c), однако даже тогда я получаю то же сообщение об ошибке, что и выше.
Как мне успешно связать его с помощью компилятора командной строки (cl.exe)?
1 ответ
Способ 1
Если вы хотите скомпилировать из командной строки с cl.exe, вы можете использовать /link
возможность указать параметры компоновщика:
cl /TC program.c /link psapi.lib
Способ 2
Следующая директива pragma заставляет компоновщик искать в вашем исходном файле библиотеку psapi.lib при компоновке.
#pragma comment( lib, "psapi.lib" )
Возможной причиной ваших ошибок может быть, если psapi.lib отсутствует в списке дополнительных библиотек компоновщика.
Чтобы решить эту проблему, используйте следующую опцию /LIBPATH:
cl /TC program.c /link Psapi.Lib /LIBPATH:C:\MyLibFolder\
Где C:\MyLibFolder указывает путь к папке, в которой находится ваш файл psapi.lib.
Также вы можете попытаться установить правильную опцию /SUBSYSTEM.
Для консольного приложения используйте:
/SUBSYSTEM:CONSOLE
Решение подобной проблемы здесь.
Пример использования функции GetModuleInformation:
#include <windows.h>
#include <stdio.h>
#include <psapi.h>
#pragma comment( lib, "psapi.lib" )
int main(void)
{
MODULEINFO minfo = {0};
GetModuleInformation( GetCurrentProcess(), GetModuleHandle( "psapi.dll" ), &minfo, sizeof(minfo) );
/* printf("%X", minfo.lpBaseOfDll); /* The load address of the module */
return 0;
}
Код был протестирован на Windows 7 и XP .
Выход из сеанса связи:
program.c
/out:program.exe
psapi.lib
/LIBPATH:C:\MyLibFolder\
/SUBSYSTEM:CONSOLE
/VERBOSE
program.obj
Starting pass 1
Processed /DEFAULTLIB:uuid.lib
Processed /DEFAULTLIB:LIBCMT
Processed /DEFAULTLIB:OLDNAMES
Searching libraries
Searching C:\MyLibFolder\psapi.lib:
Found _GetModuleInformation@16
Referenced in program.obj
Loaded psapi.lib(PSAPI.DLL)
Found __IMPORT_DESCRIPTOR_PSAPI
Referenced in psapi.lib(PSAPI.DLL)
Loaded psapi.lib(PSAPI.DLL)
Found __NULL_IMPORT_DESCRIPTOR
Referenced in psapi.lib(PSAPI.DLL)
Loaded psapi.lib(PSAPI.DLL)
...
Если vsvars32.bat и все соответствующие переменные среды в вашей Visual Studio установлены правильно, указанные выше параметры компоновщика приведут к действительному исполняемому файлу (.exe).