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")
VS 2010 - #pragma comment (lib, XX) 有效,Additional Dependencies 无效。为啥?