40

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

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

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

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

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

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

4

3 回答 3

72

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

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

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

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

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

于 2012-08-30T14:51:36.567 回答
12

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

于 2012-08-30T14:57:16.800 回答
-1

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

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

于 2012-08-30T14:51:49.770 回答