Visual C ++ - 库的客户端不知道库已使用pragma comment lib更改

时间:2015-06-16 17:58:39

标签: c++ linker visual-studio-2005

我正在使用的代码库使用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的帖子,并认为它适用于很多人。在我的整体代码库和我的测试中,它无法正常工作。我肯定错过了什么。

斯科特

2 个答案:

答案 0 :(得分:1)

comment lib pragma插入一个链接器指令。链接器会看到此内容并将该库添加到其输入列表中。就是这样。你想要的是一个项目依赖项,你似乎知道如何配置。

Visual Studio 2005 pragma comment documentation

答案 1 :(得分:1)

这是MSBuild的known limitation(VS2010 +版本背后的构建引擎),很可能是VCBuild(VS2005版本中的引擎),并且真正适用于所有合理的构建引擎:

Dependency analysis仅接收项目文件 - vcproj,vcxproj,make files等等。如果将依赖项注入源文件(使用#pragma lib),则会使构建系统完全不可见,从而绕过依赖项分析并在依赖项更改时阻止所需的构建。 / p>

优良作法是使用pragma-comment-lib仅在非常稳定的组件上表达依赖关系。如果您偶尔需要响应组件中的更改,则pragma lib不适合您。