分别构建第二个可执

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分别构建第二个可执相关的知识,希望对你有一定的参考价值。

我有一个使用CMake作为构建系统的C ++项目。总而言之,它在项目的根目录中有一个CMakeLists.txt,用于配置一些变量,设置主要源,并将主要源添加到主可执行文件中;然后,它会多次调用add_librarytarget_link_libraries(对于SDL2,GLAD和JsonCPP)。接下来,它创建了第二个可执行文件,其中包含一些自己的源代码以及主可执行文件中也使用的一些源代码和库。虽然与问题无关,但此可执行文件仅包含单元测试。

虽然我当前的配置确实产生了想要的结果,即作为项目本身的一个可执行文件和包含单元测试的完全独立的可执行文件,但它仍然增加了构建时间的开销。你看,每当我调用make时,主要可执行文件和第二个可执行文件都会被构建。我想要的是make只构建主可执行文件,并为make test(或make testsmake catch)构建第二个可执行文件。

我尝试了一些方法,但由于某种原因没有成功,我在互联网上的搜索结果很少。我有一种感觉,答案在add_custom_command内,并且我根本无法理解它。

答案

您还应该确保单元测试目标和主目标尚未与依赖项链接(例如,add_dependencies命令)。当然,如果2个目标共享一个源文件(他们不应该这样做!)那么没有广泛的重构就没有多少可以做到的事情。

您可以在第二个单元测试目标上使用EXCLUDE_FROM_ALL目标属性。但是,具有单独的源(如前所述)将避免在更改主源文件时不必要地重建单元测试。

此外,为了使用自定义名称调用该目标(如果不希望更改可执行文件的名称),您可以添加一个空的自定义目标,然后从所需的实际目标添加依赖项,如下所示:

add_custom_target(tests)

# various other unit test targets
add_executable(FooUnitTest [...])

add_dependencies(tests FooUnitTest)

这将允许您键入make tests并构建假目标所依赖的所有过时目标。

另一答案

一个普通的make隐含地称为make all。因此,如果您想构建单个目标,则必须通过make <target>显式调用它。

要列出CMake生成的所有目标,请调用make help

另一答案

您可以创建两个可执行文件,而无需使用cmake中的object libraries两次编译源代码。

add_library( common_objects OBJECT ${MY_SOURCES})

add_executable(exec1 $<TARGET_OBJECTS:common_objects> ${SOURCES_ONLY_FOR_FIRST})

# different configuration may be set
add_executable(exec2 $<TARGET_OBJECTS:common_objects> ${SOURCES_ONLY_FOR_SECOND})

以上是关于分别构建第二个可执的主要内容,如果未能解决你的问题,请参考以下文章

想要使用 SharePreferences 更新第二个片段中的数据,但第二个片段没有更新

如何在 Fragment 之间传递值

第一个片段替换为第二个片段后,如何打开导航抽屉

从第二个片段访问时 ViewModel 数据丢失状态

用片段替换时操作栏向下移动

构建自己的AngularJS - 作用域和Digest