C++ 如何使用cmake为嵌套子目录设置Visual Studio筛选器
我有以下结构C++ 如何使用cmake为嵌套子目录设置Visual Studio筛选器,c++,visual-studio,visual-studio-2012,cmake,C++,Visual Studio,Visual Studio 2012,Cmake,我有以下结构 Main (dir) +-- CMakeLists.txt +-- File.cpp +-- File.hpp +-- Dir (dir) +-- CMakeLists.txt +-- File1.cpp +-- File1.hpp +-- File2.cpp +-- File2.hpp Main/CMakeLists.txt CMA
Main (dir)
+-- CMakeLists.txt
+-- File.cpp
+-- File.hpp
+-- Dir (dir)
+-- CMakeLists.txt
+-- File1.cpp
+-- File1.hpp
+-- File2.cpp
+-- File2.hpp
Main/CMakeLists.txt
CMAKE_MINIMUM_REQUIRED (VERSION 2.8.11)
PROJECT(Main)
FILE(GLOB SOURCE
"*.hpp"
"*.cpp"
)
ADD_SUBDIRECTORY(Dir)
ADD_EXECUTABLE(Main ${SOURCE})
FILE(GLOB LOCAL_SOURCE
"*.hpp"
"*.cpp"
)
SET(SOURCE
${SOURCE}
${LOCAL_SOURCE}
PARENT_SCOPE
)
Main/Dir/CmakeLists.txt
CMAKE_MINIMUM_REQUIRED (VERSION 2.8.11)
PROJECT(Main)
FILE(GLOB SOURCE
"*.hpp"
"*.cpp"
)
ADD_SUBDIRECTORY(Dir)
ADD_EXECUTABLE(Main ${SOURCE})
FILE(GLOB LOCAL_SOURCE
"*.hpp"
"*.cpp"
)
SET(SOURCE
${SOURCE}
${LOCAL_SOURCE}
PARENT_SCOPE
)
它在Visual Studio中生成了以下结构我想要什么: 我的尝试: Main/CMakeLists.txt Main/Dir/CmakeLists.txt 我得到的: 请帮我解决这个问题
- 我不想在主目录中使用带有筛选器的单个CmakeFile.txt
- 实际结构是多层深嵌套结构。因此,请建议解决方案,这将适用于任何级别的子目录
cmake_minimum_required(VERSION 2.8.10)
project(Main CXX)
set(
source_list
"File.cpp"
"File.hpp"
"Dir/File1.cpp"
"Dir/File1.hpp"
"Dir/File2.cpp"
"Dir/File2.hpp"
)
add_executable(Main ${source_list})
foreach(source IN LISTS source_list)
get_filename_component(source_path "${source}" PATH)
string(REPLACE "/" "\\" source_path_msvc "${source_path}")
source_group("${source_path_msvc}" FILES "${source}")
endforeach()
请参阅文档,您必须给子目录加上双反斜杠
出于我将您的文件(GLOB…
替换为所有源文件的专用列表的原因,我想引用CMake的命令文档:
我们不建议使用GLOB
从中收集源文件列表
您的源代码树。如果没有CMakeLists.txt文件,则在创建源时会更改
添加或删除后,生成的生成系统无法知道何时添加
让CMake再生
这是我的故障保护版本(检查绝对路径),用作函数:
function(assign_source_group)
foreach(_source IN ITEMS ${ARGN})
if (IS_ABSOLUTE "${_source}")
file(RELATIVE_PATH _source_rel "${CMAKE_CURRENT_SOURCE_DIR}" "${_source}")
else()
set(_source_rel "${_source}")
endif()
get_filename_component(_source_path "${_source_rel}" PATH)
string(REPLACE "/" "\\" _source_path_msvc "${_source_path}")
source_group("${_source_path_msvc}" FILES "${_source}")
endforeach()
endfunction(assign_source_group)
在这个例子中,你会用
assign_source_group(${source_list})
我知道使用CMAKE glob函数通常是不受欢迎的,但在我的例子中,我发现它比显式命名每个文件要好。我想我会用GLOB修改Florian的答案
# This code sorts the project files as they appear in the root directory
# Generate a list of all .c & .h files in the current directory and sub directores.
file(
GLOB_RECURSE source_list RELATIVE
"${CMAKE_CURRENT_SOURCE_DIR}"
*.c *.h
)
foreach(source IN LISTS source_list)
get_filename_component(source_path "${source}" PATH)
string(REPLACE "/" "\\" source_path_msvc "${source_path}")
source_group("${source_path_msvc}" FILES "${source}")
endforeach()
message(STATUS "Tree reorganized")
自CMake起,source\u group
命令提供了一个树
参数来递归搜索源的文件路径,并构造源组以匹配文件系统结构。现在,这提供了一个更干净的解决方案:
project(Main)
set(SOURCE_LIST
"File.cpp"
"File.hpp"
"Dir/File1.cpp"
"Dir/File1.hpp"
"Dir/File2.cpp"
"Dir/File2.hpp"
)
add_executable(Main ${SOURCE_LIST})
# Create the source groups for source tree with root at CMAKE_CURRENT_SOURCE_DIR.
source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${SOURCE_LIST})
我想对他的回答发表评论,但由于缺乏“声誉”,我不能
反正
source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${SOURCE_LIST})
工作起来很有魅力,但我还需要设置:
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
它可以正常工作,但它的过滤方式是:E:>Code>Demo>Main>file.cpp&E:>Code>Demo>Main>Dir>file1。cpp@Jai如果仍要使用
文件(GLOB…
,则需要添加相对文件。因此,在您的文件中(GLOB\u RECURSE source\u list RELATIVE“${CMAKE\u CURRENT\u source\u DIR}”“*.cpp”“*.hpp”)
。谢谢您,我使用您给定的CMAKE文件中的一些操作实现了我的要求。您知道将来有什么计划支持这种开箱即用的吗?@lanoxx它是VS2017的一部分。现在,您只需使用包含主CMakeLists.txt
文件的文件夹执行File/Open/Folder
。