我目前正在尝试弄清楚两个不同的 native 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
文件吗?
或者我是否总是需要一个额外的静态库项目? (据我所知,obj
文件的静态库是 just a container。)
我为什么要这样做?看看这篇博文:Writing Unit Tests in Visual Studio for Native C++ .
它使用静态库的唯一目的是拥有两个不同的可执行文件(主函数,如果你愿意的话)。 (忘记托管/CLI 的东西。)这意味着您的解决方案中有 3 个项目(必须维护三个项目),而您实际上只想要两个共享相同代码和相同编译设置但使用不同主/启动的项目索具。
最佳答案
通过为两个项目强制执行相同的编译标志并使项目 A 的中间体成为项目 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
在一个项目中包含整个代码库(生产代码、公共(public)库、测试),即一个单元,该单元完全配置和分发,并附有单个版本号。当最终用户/分销商安装时,将链接一个程序 production.exe
。当用make all
编译时,便利库和必要的对象会被编译到build目录下,而当调用make check
时,只编译单元测试需要的对象,链接的生产代码和运行测试。再次抱歉,我无法将其翻译成 Microsoft Speak。
关于c++ - 在 C++ 项目之间共享中间文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7579774/