我的背景是C#,但我必须维护一些遗留(MS)C++.在那个代码库中我弄明白:
#pragma comment(lib, "OtherLib700.lib")
Run Code Online (Sandbox Code Playgroud)
其中700是一些版本.除了lib是一个具有相同名称的DLL.
我首先想到的程序将依赖于DLL,但在从系统中删除后,程序仍然有效.但是有一个更新版本的DLL,名为OtherLib900 ...
似乎程序"包含"了lib的代码,因此它不再依赖于外部DLL.(或者程序'自动'使用较新的DLL ...)
哪一个是正确的?是否有办法进一步确认"假设"?
Luc*_*ore 53
这pragma用于链接指定的.lib文件.这是在项目设置的外部依赖项字段中指定库的替代方法.
大多数情况下,它用于支持不同的版本:
#ifdef USE_FIRST_VERSION
#pragma comment(lib, "vers1.lib")
#else
#pragma comment(lib, "vers2.lib")
#endif
Run Code Online (Sandbox Code Playgroud)
当您的应用程序使用动态链接库时,lib文件会告诉您有关导出的符号的信息dll.所以基本上你只需要lib编译和链接,但你需要dll运行程序,因为它包含所有的二进制代码.
你说有一个关联dll,通常表明该lib文件只包含链接信息,没有代码.如果dll找不到关联,您应该收到运行时错误.您可以检查MSVS是否dll已加载其他版本或从其他位置加载.
如果一个程序有这个编译指示,它将查找该库OtherLib700.lib.如果这是加载程序时的导入库,则windows将OtherLib700.dll在路径中搜索.它不会尝试OtherLib900.dll在执行期间寻找,所以它必须dll在不同的文件夹中找到你.这假定它OtherLib700.lib是一个导入库而不是静态库.如果OtherLib700.lib是一个静态库,那么这就是它所需要的.