cmake:如何迭代目录中的所有源文件并将每个源文件构建为可执行文件?
cmake: how to iterate all source files in a directory and build each into an executable?
我有一个 cpp 文件目录,其中包含如下文件:
a.cpp b.cpp c.cpp xy.cpp ....
每个cpp文件都有一个main函数,所以我想把每个文件编译成一个可执行文件。那么我如何使用 cmake 来查找和循环所有这些源文件并分别构建它们呢?
非常感谢。
我的建议是创建一个函数来执行文件的逻辑:
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 重新 运行 正确。
这个问题不是很受欢迎,但应该是:)
根据 Guillaume Racicot 的回答,我构建了这两个非常有用的最小函数(对我来说)。如果您赞成我的回答,请考虑 up-voting 他的答案,否则我将无法写下我的答案!
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})
我有一个 cpp 文件目录,其中包含如下文件:
a.cpp b.cpp c.cpp xy.cpp ....
每个cpp文件都有一个main函数,所以我想把每个文件编译成一个可执行文件。那么我如何使用 cmake 来查找和循环所有这些源文件并分别构建它们呢?
非常感谢。
我的建议是创建一个函数来执行文件的逻辑:
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 重新 运行 正确。
这个问题不是很受欢迎,但应该是:)
根据 Guillaume Racicot 的回答,我构建了这两个非常有用的最小函数(对我来说)。如果您赞成我的回答,请考虑 up-voting 他的答案,否则我将无法写下我的答案!
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})