【问题标题】:Listing header files in Visual Studio C++ project generated by cmake列出 cmake 生成的 Visual Studio C++ 项目中的头文件
【发布时间】:2010-11-13 02:54:53
【问题描述】:

我正在为我们的产品构建一个基于 cmake 的构建系统。问题是 cmake 生成的 Visual Studio 项目在解决方案浏览器中不显示头文件。

我需要在 CMakeList.txt 中添加什么来列出头文件? 首选的解决方案是不需要列出每个特定的头文件。

解决方案 这是我带来的解决方案:

file(GLOB_RECURSE INCS "*.h")
add_library(myLib ${SRCS} ${INCS})

谢谢

【问题讨论】:

  • 作为奖励,您可以使用 source_group(headers FILES ${INCS}) 将它们显示在单独的 VS 文件夹中

标签: c++ visual-studio-2008 cmake


【解决方案1】:

只需将头文件与源文件一起添加:

PROJECT (Test)

ADD_EXECUTABLE(Test test.cpp test.h)

或者使用变量:

PROJECT (Test)

SET(SOURCE
  test.cpp
)

SET(HEADERS
  test.h
)

ADD_EXECUTABLE(Test ${SOURCE} ${HEADERS})

【讨论】:

  • IMO 所有这些答案都错过的事情(@Simeon 除外)是您不想显式列出所有头文件,因为:1. 列为显式依赖项的标头很容易与您在源代码中实际使用的那些不同步,并且 2. CMake 已经知道您使用哪些标头,因此手动输入它们也是多余的。所以我们真的需要一个答案,它需要 CMake 自己了解标头依赖项,并将它们放入一个组中以解决问题。
  • 我很欣赏依赖项扫描功能可能仅适用于某些语言......但它确实适用于 C++,如果 CMake 已经拥有这些知识可供 Visual Studio 用户使用,那就太好了。如果不是这样,至少有某种钩子,这样我们就可以在 CMake 代码中自己编写它(通过 source_group)。一个明确的依赖关系列表肯定会随着时间的推移而变得陈旧,因为即使它是错误的,编译也会继续工作。另外,它是多余的......
  • 与 source_group("My Headers" FILES ${MY_HDRS}) 结合后为我工作
【解决方案2】:

对此的基本技巧是将头文件添加到目标之一(可执行文件或库)。这尤其令人恼火,因为 cmake 已经知道所有的头文件依赖项,应该为我们处理好这些。您可以使用source_group 命令进一步组织它:

  source_group("My Headers" FILES ${MY_HDRS})

请注意,您也必须在 Xcode 中做同样的事情。

【讨论】:

    【解决方案3】:

    我在为 Qt 项目构建系统工作时遇到了同样的问题,我想出了这个解决方案,感谢此页面上的其他帖子。我包含了一个改编自我的 makefile 的完整示例。希望这会有所帮助!

    cmake_minimum_required (VERSION 2.6) 
    project (DemoSolution)
    
    find_package(Qt4 REQUIRED)
    include(${QT_USE_FILE})
    add_definitions(${QT_DEFINITIONS})
    
    include_directories (../../include/)
    set(CMAKE_INCLUDE_CURRENT_DIR ON)
    
    file(GLOB Demo_SOURCES *.cpp)
    file(GLOB Demo_HEADERS *.hpp)
    file(GLOB Demo_FORMS *.ui)
    file(GLOB Demo_RESOURCES resources.qrc)
    
    qt4_wrap_cpp(Demo_MOC ${Demo_HEADERS})
    qt4_wrap_ui(Demo_FORMS_HEADERS ${Demo_FORMS})
    qt4_add_resources(Demo_RESOURCES_RCC ${Demo_RESOURCES})
    
    source_group("Headers" FILES ${Demo_HEADERS})
    source_group("MOC" FILES ${Demo_MOC})
    
    set(QT_USE_QTNETWORK, true)
    set(QT_USE_QTSQL, true)
    set(QT_USE_QTXML, true)
    
    add_library(Demo SHARED
        ${Demo_SOURCES}
        ${Demo_HEADERS}
        ${Demo_MOC}
        ${Demo_FORMS_HEADERS}
        ${Demo_RESOURCES_RCC}
        )
    
    target_link_libraries(Demo ${QT_LIBRARIES})
    add_definitions(-D_DEMO_EXPORTS)
    

    【讨论】:

    • 进行 globbing 不是很好的形式。 stackoverflow.com/questions/1027247/…。来自 cmake 文档:我们不建议使用 GLOB 从源代码树中收集源文件列表。如果在添加或删除源时没有 CMakeLists.txt 文件发生更改,则生成的构建系统无法知道何时要求 CMake 重新生成。
    【解决方案4】:

    我知道这个答案对游戏来说真的很晚了,但是在最近版本的 Visual Studio 中,您可以将视图从“CMake 目标模式”更改为“文件夹视图”

    在此文件夹视图中,您将能够看到所有头文件。

    老实说,我愿意随时更改 Visual Studio 中的视图,而不是使用 Windows 特定的 hack 修改 CMake 文件。

    【讨论】:

    • 什么版本的 VS 有这个因为我使用的是 VS 2017 Pro 并且没有 CMake Target View 的东西? ://
    • @Daniel,我一直在使用 VS 2019,建议更新一下,因为最新版本的 CMake 支持有了很大改进。
    • 请注意,这不适用于外源构建。
    • @AlexanderRevo 这不一定是真的。我们有一个正在工作的项目,它可以进行源外构建,让您可以像这样在 Visual Studio 中查看 CMake 目标。该项目的配置非常复杂,所以我不确定他们是如何让它工作的。
    猜你喜欢
    • 2010-09-28
    • 1970-01-01
    • 2021-05-30
    • 2021-01-04
    • 1970-01-01
    • 2010-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多