C++ 在C+之间共享中间文件+;项目?
我目前正试图弄清楚两个不同的本机Visual C++项目(具有完全相同的编译器设置)是否可以共享它们的中间文件(obj、pch……) 举个例子应该有助于: 这是一个正常设置:C++ 在C+之间共享中间文件+;项目?,c++,unit-testing,visual-c++,object-files,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.v
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/<代码>文件吗?< /强> < /P> 还是我总是需要一个额外的静态库项目?(据我所知,静态库用于
obj
文件。)
我为什么要这么做?请看这篇博文:
它使用静态库的唯一目的是拥有两个不同的可执行文件(如果愿意,可以使用主函数)。(忘记托管/CLI的东西。)这意味着您的解决方案中有3个项目(必须维护3个项目),当您确实只希望两个项目共享相同的代码,具有相同的编译设置,但使用不同的主/启动装配时。通过对两个项目强制使用相同的编译标志,并使项目的中间部分成为项目B的先决条件,你移除了B的所有自由度。不可能单独编译B,你的链接表明B除了测试A之外没有任何理由。最简单、最干净的解决方案是将B中的测试合并到A中,并使整个事情成为一个项目(坦率地说,就是这样) 用汽车制造商的说法,你会将B中的单元测试声明为check_程序,它们只会被编译用于检查你的程序。我不是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
。当使用makeall
编译时,便利库和必要的对象将在build目录中编译,当调用makecheck
时,只编译单元测试所需的对象,链接到中的生产代码并运行测试。再次,很抱歉,我无法将此翻译为Microsoft Speak。通过对两个项目强制使用相同的编译标志,并将项目的中间部分作为项目B的先决条件,您可以删除B的所有自由度。单独编译B是不可能的,你的链接表明,除了测试A之外,B没有存在的理由。最简单、最干净的解决方案是将B中的测试合并到A中,并使整个项目成为一个项目(坦率地说,就是这样)
用汽车制造商的说法,你会将B中的单元测试声明为check_程序,它们只会被编译用于检查你的程序。我不是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
。当使用makeall
编译时,便利库和必要的对象将在build目录中编译,当调用makecheck
时,只编译单元测试所需的对象,链接到中的生产代码并运行测试。再次,很抱歉,我无法将此翻译为Microsoft Speak。实际上,这更像是一种对称关系。两个项目共享代码。(相同的编译工件。)但链接器将为每个对象链接不同的内容。我不熟悉汽车制造:你能给你所指的功能添加一个链接吗?我很乐意,但恐怕汽车制造手册没有那么具体。我已经添加了一个例子,说明如何在汽车制造中解决这个问题。实际上,这更像是一种对称关系。两个项目共享代码。(相同的编译工件。)但链接器将为每个对象链接不同的内容。我不熟悉汽车制造:你能给你所指的功能添加一个链接吗?我很乐意,但恐怕汽车制造手册没有那么具体。我已经添加了一个例子,说明如何在automake中解决这个问题。