【问题标题】:Visual Studio as an editor for CMake friendly projectVisual Studio 作为 CMake 友好项目的编辑器
【发布时间】:2015-09-18 06:27:58
【问题描述】:

我正在尝试使用 Visual Studio 作为编辑器来浏览 GitHub 上的大型开源项目。目录结构看起来像

/module1/include/
/module1/src/
/module2/include/
/module2/src/
...

并且构建由 CMakeLists.txt 维护。

如果出于某种原因(例如,良好的 IntelliSense 支持)我坚持使用 Visual Studio 作为编辑器,最佳做法是什么?

  1. 我尝试了“新建 - 来自现有代码的项目”。它会产生丑陋的项目结构,其中所有 *.cpp 文件都在 Source Files 过滤器下,而我仍然需要手动指定一堆 /*/include/ 目录。

  2. 我尝试实际使用 CMake 来生成 Visual Studio 解决方案。由于许多 Linux 依赖项,它立即失败并出现许多严重错误。

有什么方法可以创建具有适当目录结构并包含路径的 Visual Studio 解决方案?

【问题讨论】:

  • 你能补充一些关于你所指的“开源项目”的细节吗?您使用 CMake 会收到哪些错误消息?一般来说,在不知道您的目标环境究竟是什么的情况下:如果您想使用 Visual Studio 作为开发基于 GNU 工具链的项目的 IDE,则可以使用诸如 VisualGDBWinGDB 之类的商业工具。
  • 该项目包含一堆运行Linux可执行文件的构建前和构建后的bash脚本,所以我不相信我可以使用VS来编译项目。我正在寻找一种方法来轻松创建启用 IntelliSense 的 VS 解决方案。这个项目很大:一百个子目录包含它们自己的 include/ 和 src/。
  • 在微软增加对 CMake 的具体支持之前,在这个阶段使用 CLion 更为现实。 VS 有一个名为 CMake Tools for Visual Studio 的插件,但它的质量取决于您自己的测试。

标签: visual-studio cmake editor


【解决方案1】:

我看到了四种可能的方法:

  1. 使用像 Visual GDBWinGDB 这样的商业产品,你可以例如import remote Linux projects to Visual Studio

  2. 您在源代码的根目录下创建一个新的空 C++ 项目并使用Importing an existing source file in Visual Studio 2012 中描述的技巧(但这似乎需要更新版本的 Visual Studio > 2012)。

    通过“显示所有文件”和“包含在项目中”,我能够获取所有源/头及其目录结构(使用 Visual Studio 2013/2015 测试)。

  3. 您可以模拟除最基本函数(如add_library()message())之外的所有函数,并尝试获取原始CMake 项目以生成Visual Studio 解决方案。例如。你用空实现来创建你的own VSToolchain.cmake or PreLoad.cmake

    macro(add_custom_command)
    endmacro()
    
    macro(add_custom_target)
    endmacro()
    
    macro(set_property)
    endmacro()
    
    ...
    

    我承认这种方法有其局限性。

  4. 您正在编写一个特殊的 main CMakeLists.txt 以将所有源/标头收集到一个新的解决方案中,例如:

    cmake_minimum_required(VERSION 2.8)
    
    project(MyProject C CXX)
    
    set(_src_root_path "${CMAKE_CURRENT_SOURCE_DIR}")
    file(
        GLOB_RECURSE _source_list 
        LIST_DIRECTORIES false
        RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}"
        "${_src_root_path}/*.c*"
        "${_src_root_path}/*.h*"
    )
    
    add_library(MySources ${_source_list})
    
    foreach(_source IN ITEMS ${_source_list})
        get_filename_component(_source_path "${_source}" PATH)
        string(REPLACE "/" "\\" _source_path_msvc "${_source_path}")
        source_group("${_source_path_msvc}" FILES "${_source}")
    endforeach()
    

    只需将其放在某处(在我的示例中为源的根;但您可以更改 _src_root_path)并生成一个包含由目录结构化的源/头文件的 Visual Studio 项目(请参阅How to set Visual Studio Filters for nested sub directory using cmake)。

【讨论】:

  • 从 CMake 3.8 开始,source_group 命令有一个 TREE 参数以递归地将源文件映射到源组。 foreach() 可以简化为单行:source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${_source_list})
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-16
  • 2015-01-12
相关资源
最近更新 更多