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).

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