【问题标题】:Add Source in a subdirectory to a cmake project将子目录中的 Source 添加到 cmake 项目
【发布时间】:2012-02-14 14:21:52
【问题描述】:

我有一个没有被划分为库的项目,但是源代码被组织在一个目录树中。我不知道如何告诉 cmake 去一个目录,然后将该目录中的源添加到父目录中定义的项目中。我尝试了以下方法:

在项目/source/CMakelists.txt:

set(SOURCE
    ${CMAKE_CURRENT_SOURCE_DIR}/unitTest/main.cpp
  )
add_subdirectory("${PROJECT_SOURCE_DIR}/folder1")
add_executable(UnitTestRNG ${SOURCE} ${HEADERS})

然后在project/source/folder1/CMakeLists.txt:

set(SOURCE
   ${SOURCE}
   ${CMAKE_CURRENT_SOURCE_DIR}/file1.cpp
   ${CMAKE_CURRENT_SOURCE_DIR}/file2.cpp
)
set(HEADERS
   ${HEADERS}
   ${CMAKE_CURRENT_SOURCE_DIR}/file1.hpp
   ${CMAKE_CURRENT_SOURCE_DIR}/file2.hpp
)

使用一些 message() 语句,我发现子文件夹将获取 SOURCE 变量的内容,但是对该变量的新分配不会在返回父 CMakeLists.txt 时持续存在

寻找示例并在 cmake 教程中使我得出以下结论: - 源文件结构通常在项目中是扁平的 - 如果代码分文件夹,通常是分到相应的库中。

我想知道是否有一些“最佳实践”在尝试这种结构时有所偏离。

【问题讨论】:

    标签: cmake


    【解决方案1】:

    就像arrowdodger回答的第二部分所说: 在 project/source/folder1/CMakeLists.txt:

    set(SOURCE
       ${SOURCE}
       ${CMAKE_CURRENT_SOURCE_DIR}/file1.cpp
       ${CMAKE_CURRENT_SOURCE_DIR}/file2.cpp
       PARENT_SCOPE
    )
    set(HEADERS
       ${HEADERS}
       ${CMAKE_CURRENT_SOURCE_DIR}/file1.hpp
       ${CMAKE_CURRENT_SOURCE_DIR}/file2.hpp
       PARENT_SCOPE
    )
    

    【讨论】:

    • 这仍然是在最新版本的 cmake 中实现这一目标的推荐方式吗?
    • 没有。见this answer
    【解决方案2】:

    从 CMake 3.1 开始,有一种从子目录添加源的新方法:target_sources

    假设您有 root_dirroot_dir/sub_dir 以及两者中的源文件。使用target_sources,您可以这样做:

    root_dir/CMakeLists.txt 中定义目标

    add_library(some_target main.cpp)
    add_subdirectory(sub_dir)
    

    root_dir/sub_dir/CMakeLists.txt 添加来源:

    target_sources(some_target PRIVATE more_cool_stuff.cpp)
    

    some_target 现在将包含两个源文件。

    还可以在root_dir/sub_dir/CMakeLists.txt中使用some_target的其他命令,例如target_compile_definitions,添加编译定义相当方便。

    我了解到target_sourceshere, check it out if you want more explanation and examples

    【讨论】:

      【解决方案3】:

      那你不能在 project/source/CMakelists.txt 中设置所有源代码吗?

      无论如何,您需要的是set command 上的PARENT_SCOPECACHE 选项。

      【讨论】:

      • 你回答的第一部分确实是我在此期间一直在做的事情。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-21
      • 2011-12-20
      • 2019-07-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多