C++:#pragma comment(lib,"XXX")实际上对"XXX"做了什么?

ste*_*lig 28 c++ pragma

我的背景是C#,但我必须维护一些遗留(MS)C++.在那个代码库中我弄明白:

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

其中700是一些版本.除了lib是一个具有相同名称的DLL.

我首先想到的程序将依赖于DLL,但在从系统中删除后,程序仍然有效.但是有一个更新版本的DLL,名为OtherLib900 ...

似乎程序"包含"了lib的代码,因此它不再依赖于外部DLL.(或者程序'自动'使用较新的DLL ...)

哪一个是正确的?是否有办法进一步确认"假设"?

Luc*_*ore 53

pragma用于链接指定的.lib文件.这是在项目设置的外部依赖项字段中指定库的替代方法.

大多数情况下,它用于支持不同的版本:

#ifdef USE_FIRST_VERSION
#pragma comment(lib, "vers1.lib")
#else
#pragma comment(lib, "vers2.lib")
#endif
Run Code Online (Sandbox Code Playgroud)

当您的应用程序使用动态链接库时,lib文件会告诉您有关导出的符号的信息dll.所以基本上你只需要lib编译和链接,但你需要dll运行程序,因为它包含所有的二进制代码.

你说有一个关联dll,通常表明该lib文件只包含链接信息,没有代码.如果dll找不到关联,您应该收到运行时错误.您可以检查MSVS是否dll已加载其他版本或从其他位置加载.


dre*_*rjm 7

如果一个程序有这个编译指示,它将查找该库OtherLib700.lib.如果这是加载程序时的导入库,则windows将OtherLib700.dll在路径中搜索.它不会尝试OtherLib900.dll在执行期间寻找,所以它必须dll在不同的文件夹中找到你.这假定它OtherLib700.lib是一个导入库而不是静态库.如果OtherLib700.lib是一个静态库,那么这就是它所需要的.

  • 错误的答案.链接器从不寻找DLL,它寻找.lib..lib中的信息告诉链接器接下来要做什么 - 直接从它发出代码(也就是静态链接)或者将导入发送到.dll(.dll的名称也在.lib中编码). (2认同)