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

Neo*_*ash 9 c visual-studio-2010 cl.exe

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

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

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

#include <psapi.h>
Run Code Online (Sandbox Code Playgroud)

当我尝试编译时使用:

cl program.c
Run Code Online (Sandbox Code Playgroud)

它生成目标文件,但在链接阶段失败并出现错误:

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
Run Code Online (Sandbox Code Playgroud)

我还将psapi.lib文件放在放置源代码文件(program.c)的同一文件夹中,但即便如此,我也会收到与上面相同的错误消息.

如何使用命令行编译器(cl.exe)成功链接它?

bol*_*eto 9

方法1
如果要使用cl.exe从命令行进行编译,可以使用该/link选项指定链接器选项:

cl /TC program.c /link psapi.lib
Run Code Online (Sandbox Code Playgroud)

方法2
以下pragma指令使链接器在链接时在源文件中搜索psapi.lib库.

#pragma comment( lib, "psapi.lib" )
Run Code Online (Sandbox Code Playgroud)

如果在其他链接库列表中缺少psapi.lib,则可能出现错误的原因.
要解决此问题,请使用以下/ LIBPATH选项:

cl /TC program.c /link Psapi.Lib /LIBPATH:C:\MyLibFolder\
Run Code Online (Sandbox Code Playgroud)

其中C:\ MyLibFolder指定文件夹的路径,其中包含psapi.lib.

此外,您可以尝试设置正确的/ SUBSYSTEM选项.
对于控制台应用程序,请使

/SUBSYSTEM:CONSOLE
Run Code Online (Sandbox Code Playgroud)

解决类似的问题在这里.

使用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;
}
Run Code Online (Sandbox Code Playgroud)

该代码已在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)
        ...
Run Code Online (Sandbox Code Playgroud)

如果正确设置了vsvars32.bat和Visual Studio中的所有相应环境变量,则上述链接器选项将生成有效的可执行(.exe)文件.