2011-09-28 144 views
1

我目前正在试图找出是否有可能为两个不同的本机Visual-C++项目(具有完全相同的编译器设置)分享他们的中间文件(OBJ,PCH,...)在C++项目之间共享中间文件?

一个例子应该有所帮助:

这是一个正常的设置:

PROJECTS \ P1 \ p1.vcproj; p1.cpp; ... 
       \ Release_Intermediate_Dir \ p1.obj 
             \ tool1.obj 
     \ P2 \ p2.vcproj; p2.cpp; ... 
       \ Release_Intermediate_Dir \ p2.obj 
             \ tool1.obj 
     \ COMMON \ tool1.cpp; ... 

这个怎么样设置:

PROJECTS \ P1 \ p1.vcproj (uses: p1.cpp; p1_main.cpp) 
       \ p1_test.vcproj (uses: p1.cpp; p1_test.cpp) 
       \ Release_Intermediate_Dir \ p1.obj  (used by both projects p1 and test) 
             \ tool1.obj 
             \ p1_main.obj (only p1.vcproj) 
             \ p1_test.obj (only p1_test.vcproj 
     \ COMMON \ tool1.cpp; ... 

我可以在两个C++项目中使用相同的中间文件夹,从而直接共享obj文件吗?

或者我会一直需要一个额外的静态lib项目? (据我了解,静态库是just a containerobj文件。)


我为什么要这么做?看看这个博客文章:Writing Unit Tests in Visual Studio for Native C++

它使用一个静态库为了有两个不同的可执行文件(主要功能,如果你愿意)的唯一目的。 (忘记托管/ CLI的东西。)这意味着在你的解决方案中有3个项目(必须维护三个项目),当你真的只想要两个项目共享相同的编码设置,但使用不同的主/启动索具。

回答

1

通过为两个项目强制执行相同的编译标志并使项目的中间体成为项目B的先决条件,可以从B中移除所有的自由度。单独编译B并且您的链接建议B具有可能性除了测试A之外没有任何理由。最简单和最干净的解决方案是将B测试合并到A中,并将整个项目合并到一个项目中(坦率地说)。

在automake的说法中,你需要将B中的单元测试声明为check_PROGRAMS,它们只会被编译来检查你的程序。我不是Visual-C++专家,但这是干净的解决方案,应该用VC++来完成。

附录:澄清automake的说法,一个项目将有例如像:

noinst_LTLIBRARIES = libthings-to-test.la libthings-not-tested.la 
bin_PROGRAMS = production 
check_PROGRAMS = unit_test_a 

production_SOURCES = main.cpp 
production_LDADD = libthings-to-test.la libthings-not-tested.la 
unit_test_a_SOURCES = test.cpp 
unit_test_a_LDADD = libthings-to-test.la 
libthings_to_test_la_SOURCES = foo.cpp bar.cpp baz.cpp 

在一个项目中的全部代码库(生产代码,公共库,测试),即一个单元,其完整配置和分发,并附有单一版本号。当由最终用户/分销商安装时,单个程序​​将被链接。使用make all进行编译时,便利库和必要对象将编译到构建目录中,并且当调用make check时,将仅编译单元测试所需的对象,并链接生产代码并运行测试。再次,我很抱歉,我无法将其转换为Microsoft Speak。

+0

其实它更多的是对称关系恕我直言。两个项目都共享代码。 (相同的编译工件。)但链接器将链接每个不同的东西。我对automake并不熟悉:您可以添加指向您所指的功能的链接吗? –

+0

我很想去,但恐怕automake手册不是那么具体。我已经添加了一个例子,它将如何在automake中解决。 – thiton