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

时间:2012-08-30 14:47:51

标签: c++ pragma

我的背景是C#,但我必须维护一些遗留(MS)C ++。在那个代码库里,我不知所措:

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

其中700是一些版本。除了lib之外,还有一个同名的DLL。

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

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

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

3 个答案:

答案 0 :(得分:46)

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,则应该收到运行时错误。如果加载了dll的不同版本或者是从其他地方加载了{{1}},您可以查看MSVS。

答案 1 :(得分:6)

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

答案 2 :(得分:-1)

如果.lib是一个带有实际代码的“真正的”lib(我从来没有使用DLL保存为系统提供的,但我相信你为自己的DLL制作'import libs'),那么DLL不是必需的。

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