【问题标题】:CLion equivalent of Visual Studio C++ "filters"CLion 相当于 Visual Studio C++“过滤器”
【发布时间】:2020-11-05 11:47:44
【问题描述】:

上下文

在 Visual Studio IDE 中,对于 C++ 解决方案,您可以使用所谓的“过滤器”来模拟源文件树/目录,同时通常将每个项目的所有源代码保留在每个项目的根目录中。主要优点是可以直接#include "foo.h"

我一直在尝试将一些解决方案“切换”到 CLion,因为它专注于多平台,并试图将对 CMake+GCC 的支持添加到现有的 VS 解决方案中,因为没有跨平台 IDE 原生支持 @987654323 @文件

现在 - 我知道一些较大的 CMake 项目(如解决方案/子项目组)通常使用普通文件系统子目录来进一步分解每个子项目中的代码,但由于我正在尝试添加一些“解决方案” CMake 支持,考虑到几百个源文件,我真的无法手动重构所有内容并将每个文件中的 #include "service_foo.h" 更改为 #include service/service_foo.h

还要考虑的另一件事是我不会迁移解决方案以使用 CMake - 我正在添加对 CMake 构建/CLion IDE 支持以及 MSBuild 工具链/VS IDE 支持的支持,所以我不想介绍任何重大更改。

我对 JetBrains IDE 生态系统还很陌生,所以我想知道是否有一些东西可以提供这种开箱即用的功能,或者可以通过插件提供。

问题

有没有什么方法可以在不更改文件系统的情况下将源文件分组,即在 CLion IDE 的项目视图工具箱中?

目前无法在文档中找到任何内容,但它与 Code Hierarchy 类似,但用于 .h/.cpp 文件。

示例

文件系统结构(在磁盘上可见)
$REPO_ROOT*.vcxproj, .idea/ 等提供的存储库。

Main CMakeList.txt: $REPO_ROOT/CmakeList.txt
Example subprojects: $REPO_ROOT/foo_slib/ $REPO_ROOT/program/
Example Source files: $REPO_ROOT/program/main.cpp $REPO_ROOT/program/gui_init.h $REPO_ROOT/program/VulkanDelegate.h 

项目/解决方案根结构(如 IDE 中的项目工具箱视图中所示)
$VIEW_ROOT 是为 CLion 打开的主项目或为 MSVS 打开的 .sln,如在每个 IDE 中的项目视图中所示

Main CmakeList.txt: $VIEW_ROOT/CMAKE/CmakeList.txt
Example subprojects: $VIEW_ROOT/foo_slib/ $VIEW_ROOT/program/
Example Source files: $VIEW_ROOT/program/main.cpp $VIEW_ROOT/program/GUI/gui_init.h $VIEW_ROOT/program/Delegates/VulkanDelegate.h

【问题讨论】:

    标签: visual-studio visual-studio-2019 clion jetbrains-ide


    【解决方案1】:

    您肯定不需要编辑源文件和更改包含路径。没有什么可以阻止您使用编译器include path option, -I<path> 实现相同的#include 路径。在 CLion 中,它是通过 CMake's target_include_directories 指令控制的。您可能还需要弄清楚项目是如何关联的。

    您可以将文件和文件夹添加到 CLion 的favorites。您可以拥有多组收藏夹,因此可以模拟项目中的任意虚拟文件夹。

    对于更详细的查询语言,有Scopes。您可以设置它们,然后它们将出现在Project view 的“视图”下拉列表中,每个都作为单独的视图。

    【讨论】:

    • target_include_directories 似乎不是我想要的,因为这也需要更改 MSVS 解决方案/项目,因为据我了解,它与 VS 的 C/C++->General->Additional 相同包括目录,这将需要更改文件系统(将子项目中的代码排序到子目录,破坏存储在.vcxproj 中的文件的路径)我的印象add_subdirectory 严格用于添加新子项目,不能用于简单排序代码 - 如果我错了,请纠正我我在这里添加了我想要实现的示例,请参阅更新的问题
    • 您似乎有一个假设,迫使您在源文件或项目文件中编辑包含路径。这种假设是错误的。如果 VS 可以有一组包含路径(这就是项目所做的),那么 CMake 文件也可以执行相同的包含路径。您甚至可以使用 VS 项目来准确计算每个项目使用的包含路径。
    • 我已经删除了add_subdirectory 参考,因为它不是您在这里需要的(还),但提到了一个“收藏夹”功能,这似乎更接近问题所要询问的内容。
    • 收藏夹似乎是我一直在寻找的,但遗憾的是似乎没有像 fav_dir/fav_subdir/*.cpp 等那样嵌套它们的选项。我知道我可以添加整个文件夹,但这并不真正适合我想要做的事情,因为我每个子项目结构都有文件夹,只是想对每个子项目中的代码进行排序。你知道是否有办法将它们嵌套在 IDE 一侧(我想我可以只创建带有符号链接到源文件的目录并将它们添加到收藏夹以模拟嵌套,但这是很多手动工作)
    • 好吧,文件符号链接将不起作用,因为代码洞察力无法正常工作,因为它读取符号链接位置而不是打开指向的文件(无论如何这太 hacky),这使得 IDE 的全部意义走了。而且我真的找不到任何关于嵌套收藏夹的信息,所以如果有任何插件或任何你知道的东西,可以让嵌套成为可能,我将不胜感激
    【解决方案2】:

    如果其他人需要此功能,我最终会这样做

    解决方案

    假设你所有的 MSVS 项目(目标)都存储在 ./src/ 的根目录中(./ 是 repo 根目录)

    1. 在 repo 根目录创建同级目录,例如 ./src_cmake/
    2. 为每个存储在./src/ 中的项目创建目录./src_cmake/,假设我们已经创建了./src_cmake/libproj/ 对应于./src/libproj/
    3. libproj 为例,在./src_cmake/libproj/ 中创建对应于Visual Studio 中该项目的过滤器 树结构的子目录
    4. 在每个 filter 子目录中,创建文件符号链接到对应于 filter 内每个文件的源文件,比如 Visual Studio 中的 Solution>libproj>Debugonly> 包含debmeta.h debmeta.cpp debutil.h,需要在./src_cmake/libproj/Debugonly/创建3个新的符号链接文件,我们以debmeta.h为例
    5. 您可以使用ln -s ORIGINALFILE LINKTARGET 创建符号链接,因此在以./src_cmake/libproj/Debugonly/ 打开的shell 中使用命令
    // This will navigate 3 directories down to repo root and from there to debmeta relative path
    ln -s ../../../src/libproj/debmeta.h debmeta.h
    
    1. 这很容易被破坏(例如,将来重命名项目),并且可能需要恢复数百个符号链接。为了至少否定这一点,您可以改为这样做
    // Shell open at ./src_cmake/libproj/ instead
    ln -s ../../src/libproj .link
    cd Debugonly
    
    // Now use the .link folder so all links will be routed through it instead
    ln -s ../.link/debmeta.h debmeta.h
    
    // From now on use .link folder instead to navigate to original project directory, in case of breaking changes like new name of this subproject (at ./src_cmake/libproj/)
    rm .link
    ln -s ../../renamedsrc/renamedproj .link
    
    // This way you shouldn't have to worry about cmake tree breakage
    
    1. 如果你做了所有的事情,你最终应该得到 ./src_cmake/ 树看起来像你的 Visual Studio 项目视图树
    2. 现在在 ./CMakeList.txt 中添加子项目,您应该分别调用 add_subdirectory() 到每个项目,以便 Clion 像示例中那样正确选择目标
    add_subdirectory(src_cmake/libproj)
    add_subdirectory(src_cmake/exeproj)
    
    1. 对于./src_cmake/ 中的每个子项目,您应该添加新的CMakeList,以某种方式对应于来自./src/.vcxproj,例如 - ./src_cmake/libproj/CMakeList.txt
    2. 在每个这样的 CMakeList 中添加 target_include_directories() 并包括此项目的所有过滤器子目录,以示例为例
    target_include_directories(libproj
        PRIVATE Debugonly
    )
    
    1. 现在,由于您很可能没有手动执行任何操作(如下所述),您可能会提供脚本来生成过滤器结构和符号链接 对于./src_cmake/,而不是按原样运送文件夹,这意味着您不想跟踪除./src_cmake/ 的CMakeList.txt 之外的任何内容,并且希望忽略符号链接以免污染您的版本控制(VSC) 因为这些会导致代码更改重复
      为了防止这种情况发生,在./src_cmake/ 创建额外的.gitignore
    # Choose which one better fits your needs, but first one should be prefered
    
    # Ignore everything other than CMakeList.txt
    *
    !*/
    !CMakeList.txt
    
    # Or only ignore source code (in case of C/++
    *.c
    *.cpp
    *.h
    
    1. 这样您应该已经设置了文件系统方面的所有内容,现在您将在 Clion IDE 项目工具箱中设置范围(相当于 Visual Studio 中的解决方案过滤器 .slnf
    2. 现在仅在Edit scopes>Add(+)>Shared>递归地包含这些路径./src_cmake/ ./CMakeList.txt(您当然可以根据自己的喜好包含/排除其他内容,例如 .gitignore)
    3. 现在切换到您的新范围,您应该会得到一些可以从 Visual Studio C++ 传递给项目视图的东西

    XX。将回购根目录中的 CMakeList 以某种方式将 .sln 文件和项目文件夹中的 CmakeList 视为每个 .vcxproj,即不会污染根目录 CMakeList em> 带有项目本地配置
    这样保持 MSVS 和 CMake 同步,应该更容易

    但没有人应该手动完成所有这些,因此您可以编写一个像这样的简单脚本:

    1. 通过$SRCROOT(MSVS 项目目录)所以./src$OUTROOT(CMake 项目目录)所以./src_cmake
    2. $SRCROOT 的每个子目录在$OUTROOT 创建目录,名称取自.vcxproj,并在每个主题中创建符号链接,如$OUTROOT/$VCXPROJNAME/.link->$CD(如果可以计算的话,最好是相对路径)
    3. 在每个子文件夹/项目中对.vcxproj 使用xml 解析器,获取每个<ClInclude> 属性并与其对应的<Filter> 值 - 如果在$OUTROOT/$VCXPROJNAME/$FilterVal 不存在,则创建此类的相对路径
    4. 对于这些<ClInclude> 属性中的每一个,从提供的值创建符号链接文件,并作为链接目标使用.link 的相对路径,例如$OUTROOT/$FilterVal/$ClIncludeVal->$(.link)/$ClIncludeVal
    5. 这应该模拟$OUTROOT 处的过滤器结构,然后您可以从那里递归迭代它,为每个子项目/目标生成基本的CMakeList.txt,只需target_include_directories() 和源文件路径

    【讨论】:

      猜你喜欢
      • 2017-04-02
      • 1970-01-01
      • 2011-06-11
      • 2010-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-25
      • 2011-02-04
      相关资源
      最近更新 更多