gpt4 book ai didi

c++ - 如何使用 cmake 为嵌套子目录设置 Visual Studio 过滤器

转载 作者:IT老高 更新时间:2023-10-28 22:12:28 27 4
gpt4 key购买 nike

我有以下结构

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})

Main/Dir/CmakeLists.txt

FILE(GLOB LOCAL_SOURCE
"*.hpp"
"*.cpp"
)
SET(SOURCE
${SOURCE}
${LOCAL_SOURCE}
PARENT_SCOPE
)

它在 Visual Studio 中生成了以下结构
enter image description here

我想要什么:

enter image description here enter image description here

我尝试了什么:

Main/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})

Main/Dir/CmakeLists.txt

FILE(GLOB LOCAL_SOURCE
"*.hpp"
"*.cpp"
)
SET(SOURCE
${SOURCE}
${LOCAL_SOURCE}
PARENT_SCOPE
)

SOURCE_GROUP(Dir FILES ${LOCAL_SOURCE})

我得到了什么:

enter image description here

请帮我解决这个问题。

  • 我不想在具有过滤器的主目录中使用单个 CmakeFile.txt
  • 实际结构是多层深嵌套结构。所以请提出适用于任何级别子目录的解决方案

最佳答案

有几种现成或适应性强的解决方案可以模拟源树行为,例如在 Eclipse 中使用 CMake for Visual Studio(例如,来自 Zobra 的 ADD_SRC_SUBFOLDER DESTINATION_SRCS 或来自 Luca 的 GroupSources)。

这是我针对您的用例的简化版本:

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()

参见 source_group() 的文档你必须给子目录加上双反斜杠。

我之所以用我喜欢从 CMake 的 file() 引用的所有源文件的专用列表替换您的 file(GLOB ...)命令文档:

We do not recommend using GLOB to collect a list of source files from your source tree. If no CMakeLists.txt file changes when a source is added or removed then the generated build system cannot know when to ask CMake to regenerate.

这是我用作函数的故障安全版本(检查绝对路径):

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})

关于c++ - 如何使用 cmake 为嵌套子目录设置 Visual Studio 过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31422680/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com