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

标签 c visual-studio-2010 cl.exe

我写了一个 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) 成功链接它?

最佳答案

方法一
如果你想从命令行编译 cl.exe您可以使用 /link 选项来指定链接器选项:

cl /TC program.c /link psapi.lib

方法二
以下 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

类似问题的解决方案here .

使用 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 上测试过。
链接 session 的输出是:

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) 文件。

关于c - Visual Studio C++ 与 psapi.lib 的链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18432745/

相关文章:

c - 如何获取文件中某个字符的地址

c - 大小为 0 的数组如何存储在内存中?

c# - 在 C# 中安装应用程序之前执行一些操作

visual-studio-2010 - 从一个项目复制到另一个项目时,应用程序无法正确启动 (0xc000007b)

c++ - Visual Studio 2013 因非静态数据成员初始化而崩溃

windows - 使用静态库 libcurl.lib 构建程序

c - c中openMP代码的错误答案

c - mmap 期间 memcpy 重叠的段错误

c++ - 使用 C++ AMP 库

batch-file - Windows 批处理 (cmd.exe) 命令行参数和字符串操作