在C ++项目之间共享中间文件?

时间:2011-09-28 07:35:05

标签: c++ unit-testing visual-c++ object-files

我目前正试图弄清楚两个不同的原生Visual-C ++项目(具有完全相同的编译器设置)是否可以共享它们的中间文件(obj,pch ,. ..)

一个例子应该有所帮助:

这是正常的设置:

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项目? (据我所知,obj文件的静态库是just a container。)


为什么我要这样做?请看这篇博文:Writing Unit Tests in Visual Studio for Native C++

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

1 个答案:

答案 0 :(得分:1)

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

在automake的说法中,您将B中的单元测试声明为check_PROGRAMS,并且它们仅用于检查您的程序。我不是Visual-C ++专家,但这是一个干净的解决方案,应该可以用VC ++实现。

附录:为了澄清汽车行业的说法,一个项目就像是:

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

在一个项目中使用整个代码库(生产代码,公共库,测试),即一个单元完全配置和分发并附加一个版本号。当由最终用户/分发者安装时,将链接单个程序production.exe。使用make all进行编译时,将在构建目录中编译便捷库和必要对象,并且在调用make check时,仅编译单元测试所需的对象,链接的生产代码和测试运行。再说一遍,我很抱歉,我无法将其翻译成Microsoft Speak。