Visual Studio C ++与psapi.lib的链接

我编写了一个C程序,它调用psapi.h中定义的函数GetModuleInformation()

我正在使用Microsoft Visual Studio C ++命令行编译器(cl.exe)来编译和链接程序。

我已经包含了psapi.h头文件:

#include  

当我尝试编译时使用:

 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
如果要使用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  #include  #include  #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)文件。