代码之家  ›  专栏  ›  技术社区  ›  Hind Forsum

cmake:如何迭代一个目录中的所有源文件,并将每个源文件构建成一个可执行文件?

  •  0
  • Hind Forsum  · 技术社区  · 6 年前

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

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

    每个cpp文件都有一个main函数,因此我希望将每个文件构建成一个可执行文件。那么,如何使用cmake查找和循环所有这些源文件并分别构建它们呢?

    谢谢。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Guillaume Racicot    6 年前

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

    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)
    

        2
  •  0
  •   Marine Galantin    4 年前

    根据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()
    

    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})