繁体   English   中英

CMake Add(测试)可执行

[英]CMake Add (Test) Executable

我想创建两个可执行文件:一个用于应用程序的可执行文件,另一个用于测试应用程序。 为此,我在CMakeLists.txt文件中包含以下内容:

include_directories(include)

file(GLOB SOURCE "src/*.cc")
file(GLOB TEST "test/*.cc")

add_executable(interest_calc ${SOURCE})
add_executable(interest_calc_test "src/interest_calc.cc" ${TEST})

由于srctest目录都包含主要功能,因此我必须手动将源文件添加到“ test”可执行文件中。 是否有另一种非手动方式将所需的源文件添加到“测试”可执行文件?

此外,是否有比创建单独的测试可执行文件更好的方法来测试功能? 如果是这样,什么/如何?

改善过程的一种方法是将可执行文件的内容放入库中,然后有一个标称的“主”可执行文件(它只调用您的库)和一个“测试”可执行文件来执行该库,但是您想对其进行测试。

这样,您需要进行的所有更改都将进入库,并且可执行的构建过程将保持不变。

您可以这样做:
在当前的CMakeLists.txt中,输入以下行:

add_subdirectory(src)
add_subdirectory(测试)

然后,在每个目录中添加一个CMakeLists.txt,以将源正确链接到每个文件。

关于测试,我听说CMake可以完成测试自动化,但是我真的不知道它如何工作。

我认为最好的解决方案是创建一个 (共享或静态)和两个可执行文件 (一个用于主程序,一个用于测试主程序)。 之后,您应该将库与两个应用程序链接。 在这个答案中,我用一个小例子写下一个解释,说明如何使用cmake管理项目。

Soerenmascoj已经有一些不错的答案,但是我想给出更具体的建议。

当您已经为可执行文件提供了CMakeLists.txt并希望添加测试时,建议您添加一个静态虚拟库。 该库可以包含可执行文件的所有源,但main方法除外(如果您还没有main方法,则在一个单独的文件中将main方法选出来可能是最容易的)。 使用静态库将为您带来两个好处:

  • 最终的可执行文件的行为将与您当前的可执行文件完全相同,因此无需处理新的共享库的分发
  • 您无需处理跨共享对象边界的符号导出或抛出异常

对CMakeLists.txt的更改可能很小。 我将在此处给出一个示例,假设您使用的是cmake 3.0或更高版本。 首先,添加虚拟库之前的CMakeLists.txt示例:

project(MyProject)
set(SOURCES src/First.cc src/Second.cc src/Third.cc)

add_executable(${PROJECT_NAME} ${SOURCES} src/Main.cc)
target_include_directories(${PROJECT_NAME}
    ${CMAKE_CURRENT_SOURCE_DIR}/include
    ${CMAKE_CURRENT_SOURCE_DIR}/src
    ${CMAKE_CURRENT_BINARY_DIR})
target_compile_options(${PROJECT_NAME}
    $<$<CXX_COMPILER_ID:GNU>:-Wall;-pedantic)
target_compile_definitions(${PROJECT_NAME}
    $<$<CONFIG:Debug>:DEBUG;_DEBUG>)
set_target_properties(${PROJECT_NAME}
    PROPERTIES CXX_STANDARD 14)
target_link_libraries(${PROJECT_NAME}
    Threads::Threads)

要添加虚拟库和测试,您需要引入一个具有不同名称的新目标。 我选择在这里使用${PROJECT_NAME}_lib因为这在CMakeLists.txt上是非常非侵入性的。 这是更新的版本。 请注意,几乎在所有地方都使用${PROJECT_NAME}_lib代替${PROJECT_NAME} 现在,通过将大多数属性设置为PUBLIC ,将它们传递给可执行文件。 仅对set_target_properties()调用是不可传递的,并且对于库和可执行文件必须重复。

project(MyProject)
set(SOURCES src/First.cc src/Second.cc src/Third.cc)

add_library(${PROJECT_NAME}_lib STATIC ${SOURCES})
add_executable(${PROJECT_NAME} src/Main.cc)
target_include_directories(${PROJECT_NAME}_lib PUBLIC
    ${CMAKE_CURRENT_SOURCE_DIR}/include
    ${CMAKE_CURRENT_SOURCE_DIR}/src
    ${CMAKE_CURRENT_BINARY_DIR})
target_compile_options(${PROJECT_NAME}_lib PUBLIC
    $<$<CXX_COMPILER_ID:GNU>:-Wall;-pedantic)
target_compile_definitions(${PROJECT_NAME}_lib PUBLIC
    $<$<CONFIG:Debug>:DEBUG;_DEBUG>)
set_target_properties(${PROJECT_NAME}_lib
    PROPERTIES CXX_STANDARD 14)
set_target_properties(${PROJECT_NAME}
    PROPERTIES CXX_STANDARD 14)
target_link_libraries(${PROJECT_NAME}
    ${PROJECT_NAME}_lib
    Threads::Threads)

现在,您可以使用其他主要方法将针对${PROJECT_NAME}_lib测试链接起来。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM