我试图将我的旧CMake移植到现代CMake(CMake 3.0.2或更高版本).在旧设计中,我有多个CMakelists.txt,每个目录都包含一个CMakeLists.txt文件.
我当前项目的目录结构如下:
.
??? VizSim.cpp
??? algo
??? contacts
? ??? BoundingVolumeHierarchies
? ? ??? AABBTree.h
? ??? SpatialPartitoning
??? geom
? ??? Geometry.h
??? math
? ??? Tolerance.h
? ??? Vector3.cpp
? ??? Vector3.h
??? mesh
? ??? Edge.h
? ??? Face.h
? ??? Mesh.cpp
? ??? Mesh.h
? ??? Node.h
??? util
| |__ Defines.h
| |__ Math.h
|
??? viz
??? Renderer.h
Run Code Online (Sandbox Code Playgroud)
我打算做的只是使用一个CMakelists.txt并将所有cpp文件放在SOURCE中,并将所有标题放在HEADER中并使用add_executable.
set (SOURCE
${SOURCE}
${CMAKE_CURRENT_SOURCE_DIR}/src/mesh/Mesh.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/math/Vector3.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/VizSim.cpp
....
)
set (HEADER
${HEADER}
${CMAKE_CURRENT_SOURCE_DIR}/src/mesh/Mesh.h
${CMAKE_CURRENT_SOURCE_DIR}/src/math/Vector3.h
....
)
add_library(${PROJECT_NAME} SHARED ${SOURCE})
Run Code Online (Sandbox Code Playgroud)
这样做我担心如果使用单个CMakeLists.txt是一个好习惯.那么单个CMakeLists.txt就足够了,还是每个文件夹需要一个CMakeLists.txt?
我只能想到在我的项目中有多个CMakeLists.txt的一个很好的理由,那就是模块化.
考虑到我的项目最终会成长.
对于评论来说有点长——所以我把它作为一个答案:
在我的一个项目(一个库)中,我有很多源,我开始将其中一些源移动到子目录中util。
为此,我创建了单独的变量:
file(GLOB headers *.h)
file(GLOB sources *.cc)
file(GLOB utilHeaders
RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/util/*.h)
file(GLOB utilSources
RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/util/*.cc)
Run Code Online (Sandbox Code Playgroud)
为了使其在 VisualStudio 中美观/更方便,我插入了source_groups ,它在 VS 项目中生成适当的子文件夹。我相信它们被称为“过滤器”。
source_group("Header Files\\Utilities" FILES ${utilHeaders})
source_group("Source Files\\Utilities" FILES ${utilSources})
Run Code Online (Sandbox Code Playgroud)
当然,我必须考虑变量utilHeaders以及utilSources必须提供来源的地方:
add_library(libName
${sources} ${headers}
${utilSources} ${utilHeaders})
Run Code Online (Sandbox Code Playgroud)
就是这样。
Fred在评论中提醒我不要忘记提及它file(GLOB有一定的弱点(尽管我发现它在我们的日常工作中非常有价值)。CMake 文档中甚至提到了这一点。:
注意:我们不建议使用 GLOB 从源树中收集源文件列表。如果添加或删除源时 CMakeLists.txt 文件没有更改,则生成的构建系统无法知道何时要求 CMake 重新生成。该
CONFIGURE_DEPENDS标志可能无法在所有生成器上可靠地工作,或者如果将来添加不支持它的新生成器,则使用它的项目将被卡住。即使CONFIGURE_DEPENDS工作可靠,每次重建时执行检查仍然会产生成本。
因此,使用 时file(GLOB,您不应该忘记在添加、移动或删除文件后重新运行 CMake。另一种选择是直接在生成的内置脚本(例如 VS 项目文件)中添加、移动、删除文件,并依赖于下一次重新运行 CMake 也将覆盖这些文件。最后但并非最不重要的git pull一点是,值得考虑重新运行 CMake。
| 归档时间: |
|
| 查看次数: |
436 次 |
| 最近记录: |