c++ - CMake source_group() 在分层项目设置中无法正常工作

标签 c++ visual-studio cmake

在使 CMake 项目具有分层文件夹管理的更改之后,source_group() 似乎不再正常工作。 CMake 只是将所有内容转储到默认过滤器中。

我已经尝试了各种正则表达式来从父级获取每个源文件的相对文件路径,甚至在父级 CMakeLists.txt 中对源文件进行硬编码以查看是否是问题所在。在这些更改之后,我还尝试过几次重新生成 VS 项目。

以下是供您欣赏的示例文件:

父 CMakeLists.txt

cmake_minimum_required (VERSION 3.3)
set(SRCS)
add_subdirectory(PlatformDetection)
include_directories (.)
add_library(SystemAbstraction STATIC ${SRCS})
set_property(TARGET SystemAbstraction PROPERTY FOLDER "Engine")
set_target_properties(SystemAbstraction PROPERTIES LINKER_LANGUAGE CXX)
install (TARGETS SystemAbstraction
     ARCHIVE DESTINATION lib)

子 CMakeLists.txt:

cmake_minimum_required (VERSION 3.3)
add_subdirectory(Compilers)
set(SRCS ${SRCS} PARENT_SCOPE)

cmake_minimum_required (VERSION 3.3)      
set (COMPILER_DETECTION_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/CompilerDetection.h)
set (COMPILER_DETECTION_SRC ${CMAKE_CURRENT_SOURCE_DIR}/CompilerDetection.cpp)    
source_group("Header Files\\Platform Detection\\Compilers" FILES     ${COMPILER_DETECTION_HEADERS})
source_group("Source Files\\Platform Detection\\Compilers" FILES         ${COMPILER_DETECTION_SRC})  
set(SRCS ${SRCS} ${COMPILER_DETECTION_HEADERS} ${COMPILER_DETECTION_SRC} PARENT_SCOPE)

最佳答案

我通过编写一个 foreach 循环解决了我的问题,该循环遍历源文件并根据它们的相对路径以及它们是头文件还是源文件对它们进行分组。然后在您定义库/可执行文件的每个地方将其作为宏运行。

foreach(FILE ${SRCS}) 
    # Get the directory of the source file
    get_filename_component(PARENT_DIR "${FILE}" DIRECTORY)

    # Remove common directory prefix to make the group
    string(REPLACE "${CMAKE_CURRENT_SOURCE_DIR}" "" GROUP "${PARENT_DIR}")

    # Make sure we are using windows slashes
    string(REPLACE "/" "\\" GROUP "${GROUP}")

    # Group into "Source Files" and "Header Files"
    if ("${FILE}" MATCHES ".*\\.cpp")
       set(GROUP "Source Files${GROUP}")
    elseif("${FILE}" MATCHES ".*\\.h")
       set(GROUP "Header Files${GROUP}")
    endif()

    source_group("${GROUP}" FILES "${FILE}")
endforeach()

关于c++ - CMake source_group() 在分层项目设置中无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31966135/

相关文章:

c++ - 升级到 macOS Big Sur 11.01 后,Cocos2d-x 4.0 应用程序构建不再有效(错误 : no such file or directory: '/usr/lib/libz.dylib' )

C++:如何将一个函数(不知道其参数)传递给另一个函数?

c++ - "Debug Assertion Failed!"使用列表容器中的排序功能时出错

.net - 系统错误 5 启动 .NET 服务时访问被拒绝

c++ - MFC 应用程序在 CRecentFileList::Add 命令行 FileOpen 处断言失败

visual-c++ - 删除 cmake 上的默认标志

c++ - wxWidgets 与 append 到 wxChoice 列表相反

不创建 C++ 全局类变量

c# - 无法加载文件或程序集 'System.Runtime.CompilerServices.Unsafe'

c - 当 C 中有多个实现共享同一接口(interface)时,如何编写 CMakeLists.txt 或 Makefile 以避免冲突?