我必须维护一些遗留的(MS)C++。在该代码库中,我偶然发现:
#pragma comment(lib, "OtherLib700.lib")
其中 700 是一些版本控制。此外,该lib是一个同名的DLL。
我一开始以为程序会依赖于DLL,但是从系统中删除它后,程序仍然可以运行。不过,该 DLL 存在一个更新版本,名为 OtherLib900。
程序似乎“包含”了库的代码,因此它不再依赖于外部 DLL。 (或者程序“自动”使用较新的 DLL。)
哪一个是正确的?有没有办法进一步证实这个‘假设’?
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
或者是否从不同位置加载。
如果程序具有此编译指示,它将查找库
OtherLib700.lib
。如果这是一个导入库,当程序加载时,Windows 将在路径中搜索 OtherLib700.dll
。它不会在执行期间尝试查找 OtherLib900.dll
,因此它必须在不同的文件夹中找到您的 dll
。这假设 OtherLib700.lib
是导入库而不是静态库。如果 OtherLib700.lib 是静态库,那么这就是它所需要的。
#pragma comment( lib libname)
的文档说明如下:
将库检索记录放入目标文件中。此评论类型 必须附带一个具有名称的注释字符串参数 您希望链接器访问的库(可能还有路径) 搜索。库名称遵循默认的库检索记录 目标文件。链接器搜索该库的方式与 如果您在命令行上指定了它,只要该库不是 使用 /nodefaultlib 指定。您可以放置多个 同一源文件中的库检索记录。每条记录出现在 目标文件的顺序与源文件中的顺序相同。
如果 .lib 是一个包含实际代码的“真实”库(我从未使用过系统提供的 DLL,但我相信您为自己的 DLL 制作了“导入库”),那么该 DLL 就不是“ t 必需的。
就主题而言,#pragma comment(lib,xxx)允许程序为链接器添加某些选项。可能非常有用,尽管我错过了一些我想像这样添加的选项。给出的示例是其使用的一个主要示例:当目标文件包含在程序中时,指定的库也将被添加。