我正在使用的代码库使用pragma comment lib来表示代码对它所需的库的依赖性。它的构建非常破碎。我做了一个实验,尝试了解pragma comment lib的用法。它是我可以生成的最简单的库和库的客户端。
Foo.lib
foo.cpp
void foo() { printf("hello\n"); }
foo.h :
#pragma comment(lib, "foo.lib")
void foo();
FooTest.exe
main.cpp :
#include "foo.h"
void main()
{
foo();
}
我正在使用Visual Studio 2005(为了兼容只接受使用此版本制作的插件的大型商业程序)。问题是当foo.lib更新时,FooTest.exe不会重新编译。我对foo.cpp进行了更改,保存,构建。然后构建fooTest.exe解决方案。 fooTest.exe解决方案似乎不明白它的依赖项已被更改。
我可以通过向FooTest.exe添加链接器依赖项来解决这个问题,但这会破坏pragma注释lib的整个点。
我已阅读很多关于pragma comment lib的帖子,并认为它适用于很多人。在我的整体代码库和我的测试中,它无法正常工作。我肯定错过了什么。
斯科特
答案 0 :(得分:1)
comment lib
pragma插入一个链接器指令。链接器会看到此内容并将该库添加到其输入列表中。就是这样。你想要的是一个项目依赖项,你似乎知道如何配置。
答案 1 :(得分:1)
这是MSBuild的known limitation(VS2010 +版本背后的构建引擎),很可能是VCBuild(VS2005版本中的引擎),并且真正适用于所有合理的构建引擎:
Dependency analysis仅接收项目文件 - vcproj,vcxproj,make files等等。如果将依赖项注入源文件(使用#pragma lib),则会使构建系统完全不可见,从而绕过依赖项分析并在依赖项更改时阻止所需的构建。 / p>
优良作法是使用pragma-comment-lib仅在非常稳定的组件上表达依赖关系。如果您偶尔需要响应组件中的更改,则pragma lib不适合您。