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

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

我目前正在尝试弄清楚两个不同的 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/

相关文章:

unit-testing - CakePHP2 测试登录()

c++ - "VC++"和 "C++"有什么区别?

c++ - 开关语句(字符串)继续选择默认值,除非它为零

C++ 创建随机形状的 "blob"对象

在同一类的另一个方法中调用 C++ GoogleMock 模拟方法

c# - async/await 在单元测试中优于阻塞的优势

c++ - 请参阅 VS2017 中的 C++ 编译器和链接器命令行参数

c++ - 类继承——堆叠方法

c++ - 区分模板中的整数和浮点类型

c++ - gdb 说 "cannot open shared object file"