分别构建第二个可执行文件

时间:2018-08-16 00:26:05

标签: cmake

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

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

我尝试了几种方法,但由于某种原因未成功,并且我在互联网上进行的搜索收效甚微。我感觉答案在add_custom_command之内,而我只是无法正确理解它。

3 个答案:

答案 0 :(得分:2)

您还应该确保单元测试目标和主目标尚未与依赖项链接(例如add_dependencies命令)。当然,如果2个目标共享一个源文件(它们不应该!),那么不进行大量重构就没有很多事情要做。

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

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

add_custom_target(tests)

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

add_dependencies(tests FooUnitTest)

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

答案 1 :(得分:0)

普通的make隐式调用make all。因此,如果要构建单个目标,则必须通过make <target>显式调用它。

要列出CMake生成的所有目标,请致电make help

答案 2 :(得分:0)

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

git subtree push