Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C+之间共享中间文件+;项目?_C++_Unit Testing_Visual C++_Object Files - Fatal编程技术网

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

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

我目前正试图弄清楚两个不同的本机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/<代码>文件吗?< /强> < /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中解决这个问题。