【问题标题】:CMake add_subdirectory in subdirectory not included不包括子目录中的 CMake add_subdirectory
【发布时间】:2015-06-04 11:47:57
【问题描述】:

我有一个这样的目录树:

libs
   support
       db
          csv
       patterns
   support_qt
       helpers
       dialogs

等等

现在当我在support 级别执行add_subdirectory 时,我可以添加dbpatterns 并收集文件。但是在db 中,我添加了另一个add_subdirectory 引用csv,但不知何故这被忽略了。

support

set(SUPPORT_SOURCE
    ${CMAKE_CURRENT_SOURCE_DIR}/support_defs.h
    ${CMAKE_CURRENT_SOURCE_DIR}/support_dll_api.h
    ${CMAKE_CURRENT_SOURCE_DIR}/supportlib_namespace.h
    ${CMAKE_CURRENT_SOURCE_DIR}/dll_main.cpp
)

add_subdirectory (db)
add_subdirectory (patterns)

db

set(SUPPORT_SOURCE ${SUPPORT_SOURCE}
    ${CMAKE_CURRENT_SOURCE_DIR}/column_types.h
    ${CMAKE_CURRENT_SOURCE_DIR}/dbcolumn.h
    ${CMAKE_CURRENT_SOURCE_DIR}/database_login.h
    ${CMAKE_CURRENT_SOURCE_DIR}/database_login.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/type_helper.h
    ${CMAKE_CURRENT_SOURCE_DIR}/type_helper.cpp

    PARENT_SCOPE
)

add_subdirectory(csv)

以上工作正常,但在csv

set(SUPPORT_SOURCE ${SUPPORT_SOURCE}
    ${CMAKE_CURRENT_SOURCE_DIR}/csv.h
    ${CMAKE_CURRENT_SOURCE_DIR}/csv.cpp

    PARENT_SCOPE
)

但是这些文件不包含在构建中。那么我必须把 add_subdirectory 调用都放到根文件中吗?

【问题讨论】:

  • PARENT_SCOPE 只上一级。我认为使用 CACHE INTERNAL 全局变量会更好,例如 set(SUPPORT_SOURCE ${SUPPORT_SOURCE} ${CMAKE_CURRENT_SOURCE_DIR}/dbcolumn.h [...] CACHE INTERNAL "") 但我不确定它如何与多次设置的变量一起使用。

标签: cmake


【解决方案1】:

刚刚找到解决方案。我必须将add_subdirectory 放在set 命令之前。

add_subdirectory(csv)
set(SUPPORT_SOURCE ${SUPPORT_SOURCE}
    ${CMAKE_CURRENT_SOURCE_DIR}/column_types.h
    ${CMAKE_CURRENT_SOURCE_DIR}/dbcolumn.h
    ${CMAKE_CURRENT_SOURCE_DIR}/database_login.h
    ${CMAKE_CURRENT_SOURCE_DIR}/database_login.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/type_helper.h
    ${CMAKE_CURRENT_SOURCE_DIR}/type_helper.cpp

    PARENT_SCOPE
)

【讨论】:

  • 对于大型项目,通常可以使用通配符。
  • 但是通过 globbing 它也会找到生成的文件,对吧?我还有一些文件没有包含在 lib 中,但仍在该目录树中。
  • @Antonio 我个人避免使用通配符,请参阅stackoverflow.com/a/18538444/678093
  • @m.s. Globbing 节省了大量繁琐且信息量不足的 cmake 代码。不过,这必须小心翼翼地完成,我同意这一点。例如,我们使用 git hooks 来触发 cmake 在从存储库中拉取后的下一个构建时运行。让我们也链接the other, more popular, answer :)
  • @Devolus 当然,它会找到您的通配表达式匹配的任何内容。您可以决定使用非常广泛的通配符,并排除罕见的额外文件(在这个意义上有很多 Q/A:stackoverflow.com/q/16449676/2436175stackoverflow.com/q/15550777/2436175stackoverflow.com/q/13114680/2436175)。或者您可以使用更具体的 globbing 函数来仅获取您需要的文件/目录。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-29
  • 2018-10-28
  • 1970-01-01
相关资源
最近更新 更多