【问题标题】:CMake generate list of source files without globCMake生成没有glob的源文件列表
【发布时间】:2017-12-18 20:15:30
【问题描述】:

我目前正在使用这段代码来生成我的源文件列表 让 CMake 编译我的 C++ 项目:

file(GLOB CPP_FILES src/*.cpp)

正如我在这里读到的那样,CMake 不鼓励这样做,我想知道我是否可以明确列出使用 CMake 的 CMake 源文件,因为我不熟悉 Python 等脚本语言。

我问这个问题是因为手动将所有 cpp 文件添加到 CMake 中需要大量工作,尤其是在与多人一起工作时。

该项目独立于平台,我的源文件位于子文件夹中。

【问题讨论】:

  • 我想知道我是否可以明确列出源文件我几乎所有项目都这样做。即使是拥有一千个源文件的文件。
  • CMake 不会生成列表并修改 CMakeLists.txt 如果这是您所追求的。我在编写代码时手动一一添加文件名。
  • 这就是我所追求的,因为将所有文件手动添加到 CMake 需要大量工作,尤其是在与多人一起工作时。

标签: c++ visual-studio cmake cross-platform visual-studio-2017


【解决方案1】:

CMake 没有本地方法可以为您执行此操作。

对于大型或共享项目,您可以使用一个脚本来生成一个列出源文件的 CMake 文件,该脚本可以由任何可以扫描文件系统或其他存储库的东西创建。

然后你可以include()这个生成的CMake文件。

CMake 文件中的指令可能将target_sources() 用于已知目标。

CMakeLists.txt:

add_executable(myexe "")
include(sourcelist)

sourcelist.cmake:

target_sources(myexe PRIVATE
    mysourcefile1.cpp
    mysourcefile2.cpp
)

或者通过附加到一个变量:

CMakeLists.txt:

include(sourcelist)
add_executable(myexe ${sources})

sourcelist.cmake:

set(sources ${sources} 
    mysourcefile1.cpp
    mysourcefile2.cpp
)

【讨论】:

  • 您能解释一下在 myexe 之后使用 PRIVATE 关键字的原因吗?
  • @shadowdragon 它只是使用您添加的信息的人。 “PRIVATE”表示只有当前目标使用它。 “INTERFACE”表示只有其他目标使用它,而当前目标没有使用它。 “PUBLIC”表示该目标和其他目标都使用该信息。由于这种情况下的信息只是可执行文件的源文件名,因此几乎可以肯定它对其他目标完全无用,因为可执行目标几乎从未被其他目标使用(与库不同),即使它们是,它也不会用于源.在这种情况下,您可以使用 PRIVATE 或 PUBLIC。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多