1

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


我为什么要这样做?查看这篇博文:在 Visual Studio 中为 Native C++ 编写单元测试

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

4

1 回答 1

1

通过对两个项目强制执行相同的编译标志并使项目 A 的中间体成为项目 B 的先决条件,您可以从 B 中删除所有自由度。单独编译 B 是不可能的,并且您的链接表明 B 没有理由 d'除了测试 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

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

于 2011-09-28T12:09:37.580 回答