cmake:如何遍历目录中的所有源文件并将每个源文件构建为可执行文件?

时间:2019-02-18 02:17:54

标签: c++ loops cmake directory executable

我有一个cpp文件目录,其中包含以下文件:

a.cpp b.cpp c.cpp xy.cpp ....

每个cpp文件都有一个主要功能,因此我希望将每个文件都构建为可执行文件。那么,如何使用cmake查找并循环所有这些源文件并分别构建它们?

非常感谢。

2 个答案:

答案 0 :(得分:1)

我的建议是使一个函数执行文件逻辑:

function(add_test_file TEST_NAME TEST_FILE)
    add_emecutable(${TEST_NAME} ${TEST_FILE})

    target_link_library(${TEST_NAME} PUBLIC test_deps)
endfunction()

然后手动添加每个文件:

add_test_file(a_test a.cpp)
add_test_file(b_test b.cpp)
add_test_file(c_test c.cpp)
add_test_file(xy_test xy.cpp)

这样,当您添加新文件时,它将触发CMake重新正确运行。

答案 1 :(得分:0)

问题不那么受欢迎,但值得:)

根据Guillaume Racicot的回答,我构造了这两个对我来说非常有用的极小值函数。如果您投票赞成我的答案,请考虑也投票赞成他的答案,否则我将无法写下我的答案!

function(add_exe_linked_to_lib TEST_NAME TEST_FILE CLASS_SET)
    add_executable(${TEST_NAME} ${TEST_FILE})
    target_link_libraries(${TEST_NAME} PUBLIC ${CLASS_SET})
endfunction()

function(add_test_linked_to_lib TEST_NAME TEST_FILE CLASS_SET)
    add_exe_linked_to_lib(${TEST_NAME} ${TEST_FILE} ${CLASS_SET})
    add_test(NAME ${TEST_NAME} COMMAND ${TEST_NAME})
endfunction()

一个cmake文件如下所示:

function(add_exe_linked_to_lib TEST_NAME TEST_FILE CLASS_SET)
    add_executable(${TEST_NAME} ${TEST_FILE})
    target_link_libraries(${TEST_NAME} PUBLIC ${CLASS_SET})
endfunction()

function(add_test_linked_to_lib TEST_NAME TEST_FILE CLASS_SET)
    add_exe_linked_to_lib(${TEST_NAME} ${TEST_FILE} ${CLASS_SET})
    add_test(NAME ${TEST_NAME} COMMAND ${TEST_NAME})
endfunction()


cmake_minimum_required(VERSION 3.1)
set(CMAKE_CXX_STANDARD 11)
project("SUM-UP-TESTING")

#libraries
add_library(My_Class STATIC My_Class.cpp)
add_library(Another_Lib STATIC My_Class.cpp)
set(MY_LIBS My_Class Another_Lib)

#compile options
add_compile_options(-D DEBUG)

#main
add_exe_linked_to_lib(MAIN-TESTING main.cpp ${MY_LIBS})

# TEST
enable_testing()

add_test_linked_to_lib(Test_In_Code tests/testing1.cpp ${MY_LIBS})