C++:#pragma comment(lib, "XXX") 实际上对“XXX”做了啥?

Posted

技术标签:

【中文标题】C++:#pragma comment(lib, "XXX") 实际上对“XXX”做了啥?【英文标题】:C++: What does #pragma comment(lib, "XXX") actually do with "XXX"?C++:#pragma comment(lib, "XXX") 实际上对“XXX”做了什么? 【发布时间】:2012-08-30 14:47:51 【问题描述】:

我的背景是 C#,但我必须维护一些遗留 (MS) C++。在那个代码库中我偶然发现:

#pragma comment(lib, "OtherLib700.lib")

其中 700 是一些版本控制。另外lib是一个同名的DLL。

我最初认为该程序将依赖于 DLL,但在将其从系统中删除后,该程序仍然可以工作。不过,还有一个更新版本的 DLL,名为 OtherLib900...

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

哪一个是正确的?有没有办法进一步证实“假设”?

【问题讨论】:

因接受错误答案而被否决。 另见docs.microsoft.com/en-us/cpp/preprocessor/… 【参考方案1】:

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

主要用于支持不同的版本:

#ifdef USE_FIRST_VERSION
#pragma comment(lib, "vers1.lib")
#else
#pragma comment(lib, "vers2.lib")
#endif

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

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

【讨论】:

“您只需要编译和链接的 lib” .. 所以 lib 可以像头文件 (.h) 的替代品一样吗? @Acidic 我认为 Luchian 的意思是 dll 在这种情况下是不必要的。你会发现头文件还在。 我们可以把它放在哪里呢?如果我们将它添加到 main.cpp 中是否可以,或者我们可以将它包含在任何地方(仅一次)?【参考方案2】:

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

【讨论】:

是的 700 通常会是一些版本控制,但是 windows 会寻找完全匹配的并且不会尝试加载具有相同名称的更高版本的库。 我如何知道另一个库是导入库还是静态库?那么如果它是静态的,它的代码是否包含在“我的”程序中? 我相信下面的答案描述了如何区分:***.com/questions/6402586/… 错误答案。链接器从不寻找 DLL,它寻找 .lib。 .lib 中的信息告诉链接器接下来要做什么——直接从它发出代码(也称为静态链接)或发出对 .dll 的导入(.dll 的名称也在 .lib 中编码)。 @RustyX 正确,这就是我写这篇文章时的意思。我会尽快澄清。【参考方案3】:

如果 .lib 是带有实际代码的“真实”库(除了系统提供的 DLL,我从未使用过 DLL,但我相信您为自己的 DLL 制作了“导入库”),那么 DLL不是必需的。

至于主题,#pragma comment(lib,xxx) 允许程序为链接器添加某些选项。可能非常有用,尽管我错过了一些我想像这样添加的选项。给出的示例是其使用的主要示例:当目标文件包含在程序中时,指定的库也将被添加。

【讨论】:

我认为他的意思是“静态”库。

以上是关于C++:#pragma comment(lib, "XXX") 实际上对“XXX”做了啥?的主要内容,如果未能解决你的问题,请参考以下文章

Additinal Dependencies和#pragma comment(lib,"*.lib")的分析

#pragma comment(lib,"xxx.lib")

C++ #pragma comment语法(预处理指令)

VS 2010 - #pragma comment (lib, XX) 有效,Additional Dependencies 无效。为啥?

OSG中相机参数的更改

Visual中#pragma comment(user)和gcc中#pragma Comment的目的