【问题标题】:CMake source_group() not working correctly with hierarchical project setupCMake source_group() 在分层项目设置中无法正常工作
【发布时间】:2015-11-05 02:48:16
【问题描述】:

在使 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)

【问题讨论】:

    标签: c++ visual-studio cmake


    【解决方案1】:

    我通过编写一个 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()
    

    【讨论】:

    • 我认为当source_groupadd_library commands 在同一个文件/文件夹中时,CMake 会正确获取所有相对路径。当您将source_group 移动到一个孩子CMakeLists.txt 时,您的问题是否出现了?感谢您及时通知我们。
    • 是的,确实如此。无论哪种方式,这个 for 循环都很方便。
    • 是的,很方便!我只是想了解为什么它变得必要。谢谢。
    【解决方案2】:

    我认为你需要添加set_property(GLOBAL PROPERTY USE_FOLDERS ON)

    【讨论】:

    • 已经由定义项目的基本 CMakeLists.txt 启用。
    【解决方案3】:

    这是@BlamKiwi 答案的直接副本,但添加了绝对路径以解决仅相对路径看到的问题(并放入宏中) 我会评论他的,但我没有名声。

    MACRO(GROUP_SRC SRCS)
      foreach(FILE ${SRCS}) 
        #convert source file to absolute
        get_filename_component(ABSOLUTE_PATH "${FILE}" ABSOLUTE)
        # Get the directory of the absolute source file
        get_filename_component(PARENT_DIR "${ABSOLUTE_PATH}" 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()
    ENDMACRO(GROUP_SRC)
    

    【讨论】:

      猜你喜欢
      • 2011-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-09
      • 2020-08-21
      • 2017-08-13
      相关资源
      最近更新 更多