我有一个使用CMake作为构建系统的C ++项目。总而言之,它在项目的根目录中有一个CMakeLists.txt
,用于配置一些变量,设置主要源并将主要源添加到主要可执行文件中。然后,它将继续多次调用add_library
和target_link_libraries
(对于SDL2,GLAD和JsonCPP)。接下来,它创建第二个可执行文件,其中包含一些自己的源以及主要可执行文件中也使用的某些源和库。尽管与问题无关,但是此可执行文件仅包含单元测试。
虽然我当前的配置确实产生了想要的结果,但它是项目本身的一个可执行文件,而包含单元测试的完全独立的可执行文件,却仍然增加了构建时间的开销。您会看到,每当我调用make
时,主可执行文件和第二个可执行文件都会始终生成。我想要的是让make
仅构建主可执行文件,而让make test
(或make tests
或make catch
)构建第二个可执行文件。
我尝试了几种方法,但由于某种原因未成功,并且我在互联网上进行的搜索收效甚微。我感觉答案在add_custom_command
之内,而我只是无法正确理解它。
答案 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