我有以下结构
Main (dir)
+-- CMakeLists.txt
+-- File.cpp
+-- File.hpp
+-- Dir (dir)
+-- CMakeLists.txt
+-- File1.cpp
+-- File1.hpp
+-- File2.cpp
+-- File2.hpp
主目录/CMakeLists.txt
CMAKE_MINIMUM_REQUIRED (VERSION 2.8.11)
PROJECT(Main)
FILE(GLOB SOURCE
"*.hpp"
"*.cpp"
)
ADD_SUBDIRECTORY(Dir)
ADD_EXECUTABLE(Main ${SOURCE})
主目录/目录清单.txt
FILE(GLOB LOCAL_SOURCE
"*.hpp"
"*.cpp"
)
SET(SOURCE
${SOURCE}
${LOCAL_SOURCE}
PARENT_SCOPE
)
它在Visual Studio中生成了以下结构
我想要的:
第一次
我尝试的是:
- 主目录/CMakeLists.txt*
CMAKE_MINIMUM_REQUIRED (VERSION 2.8.11)
PROJECT(Main)
FILE(GLOB LOCAL_SOURCE
"*.hpp"
"*.cpp"
)
SET(SOURCE
${LOCAL_SOURCE}
)
ADD_SUBDIRECTORY(Dir)
SOURCE_GROUP(Main FILES ${LOCAL_SOURCE})
ADD_EXECUTABLE(Main ${SOURCE})
- 主目录/目录清单.txt*
FILE(GLOB LOCAL_SOURCE
"*.hpp"
"*.cpp"
)
SET(SOURCE
${SOURCE}
${LOCAL_SOURCE}
PARENT_SCOPE
)
SOURCE_GROUP(Dir FILES ${LOCAL_SOURCE})
"我得到的是“
关于这件事,请你帮帮我。
- 我不想在具有筛选器的主目录中使用单个CmakeFile.txt
- 实际结构是多层深嵌套结构。因此,请提出解决方案,将工作在任何级别的子目录
4条答案
按热度按时间bq3bfh9z1#
有几个现成的或可适应的解决方案可以模拟源树的行为,就像Eclipse中的CMake for Visual Studio(例如,Zobra的
ADD_SRC_SUBFOLDER DESTINATION_SRCS
或Luca的GroupSources)。下面是我为您的用例提供的简化版本:
请参阅
source_group()
的文档,您必须为子目录提供双反斜杠。我之所以将您的
file(GLOB ...)
替换为所有源文件的专用列表,原因是我喜欢引用CMake的file()
命令文档中的内容:我们不建议使用
GLOB
从源代码树中收集源文件列表。如果在添加或移除源代码时没有CMakeLists.txt文件发生更改,则生成的生成系统无法知道何时要求CMake重新生成。下面是我的防故障版本(检查绝对路径),它将被用作一个函数:
在示例中,您可以使用
jtoj6r0c2#
从CMake 3.8, the
source_group
command offers aTREE
argument开始,递归搜索源文件的文件路径,并构造源文件组以匹配文件系统结构。现在,这提供了一个更干净的解决方案:w9apscun3#
我想评论https://stackoverflow.com/users/3987854/squareskittles的回答,但我不能由于缺乏“声誉”?
不管怎么说,
工作起来像一个魅力,但我还需要设置这个:
xbp102n04#
我知道使用CMAKE glob函数通常是不受欢迎的:Why is CMAKE glob evil,但在 my 的情况下,我发现它比显式命名每个文件更好。我想我会使用GLOB包括Florian的答案的修改版本。