【问题标题】: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...)

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

【问题讨论】:

标签: c++ pragma


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

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

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

【讨论】:

  • 我认为他的意思是“静态”库。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-25
  • 2013-06-02
  • 2020-11-21
  • 2015-02-26
  • 2017-06-29
  • 2013-06-13
  • 2021-10-25
相关资源
最近更新 更多