首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CLion等效于Visual C++的“过滤器”

CLion等效于Visual C++的“过滤器”
EN

Stack Overflow用户
提问于 2020-07-15 21:25:05
回答 2查看 686关注 0票数 1

上下文

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

我一直试图“切换”一些解决方案到CLion,因为它的多平台焦点,并试图将对CMake+GCC的支持已经存在的VS解决方案,因为没有跨平台的IDE对.sln/.vcxproj文件的本机支持。

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

另外要考虑的另一件事是,我不会迁移解决方案来使用CMake --我在CMake工具链/VS IDE支持的同时增加了对MSBuild构建/MSBuild IDE支持的支持,所以我不想引入任何破坏性的更改。

我仍然是JetBrains IDE生态系统的新手,所以我想知道是否有什么可以提供这种功能的现成的,或者也许有一个插件。

问题

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

到目前为止,在文档中找不到任何东西,但是它与代码层次结构有一些相似之处,但是对于.h/.cpp文件则是一样的。

示例

文件系统级结构(在磁盘上可见)

$REPO_ROOT*.vcxproj, .idea/等提供的存储库。

代码语言:javascript
复制
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中的项目视图所示

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-07-16 06:11:17

您当然不需要编辑源文件并更改包含路径。没有什么能够阻止您使用编译器#include实现相同的I路径。在CLion中,它是通过目录指令控制的。你可能还必须弄清楚项目是如何联系起来的。

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

对于更详细的查询语言,有范围。您可以设置它们,然后它们将出现在项目视图的视图下拉列表中,每个视图都是一个单独的视图。

票数 0
EN

Stack Overflow用户

发布于 2020-07-18 21:07:39

如果其他人需要这个功能,下面是我最后所做的事情

解决方案

假设您的MSVS项目(目标)都存储在./src/ (./ in repo root)的根目录下(基于每个项目的目录)。

  1. 在repo根目录下创建兄弟目录,例如./src_cmake/
  2. 使每个项目的目录存储在./src/中的./src_cmake/中,假设我们已经生成了与./src/libproj/相对应的./src_cmake/libproj/
  3. libproj为例,使./src_cmake/libproj/中的子目录与Visual中该项目的过滤器树结构相对应
  4. 在每个filter子目录中,创建与过滤器中每个文件对应的源文件的文件符号链接,假设Visual中的Solution>libproj>Debugonly>包含debmeta.h debmeta.cpp debutil.h,这将需要在./src_cmake/libproj/Debugonly/上创建3个新的符号链接文件,让我们以denmet.h为例
  5. 您可以使用ln -s ORIGINALFILE LINKTARGET创建符号链接,所以在./src_cmake/libproj/Debugonly/打开的shell中使用命令
代码语言:javascript
复制
// 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. 这将很容易打破(前)。(将来重命名项目),并且可能需要恢复数百个符号链接。至少要否定这一点,你可以这样做。
代码语言:javascript
复制
// 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项目视图树
  2. 现在,在./CMakeList.txt添加子项目中,您应该对每个项目分别调用add_subdirectory(),这样Clion就可以正确地获取目标,例如
代码语言:javascript
复制
add_subdirectory(src_cmake/libproj)
add_subdirectory(src_cmake/exeproj)
  1. 对于./src_cmake/中的每个子项目,您应该在某种程度上添加与./src/中的.vcxproj相对应的新CMakeList,例如- ./src_cmake/libproj/CMakeList.txt
  2. 在每个这样的CMakeList中添加target_include_directories()并包含该项目的所有过滤器子目录,如下所示
代码语言:javascript
复制
target_include_directories(libproj
    PRIVATE Debugonly
)
  1. 现在,由于您很可能没有手动完成任何操作(如下面所解释的),您可能会提供脚本为./src_cmake/生成筛选结构和符号链接,而不是按原样传送文件夹,这意味着您不希望跟踪./src_cmake/的任何不对称的CMakeList.txt,并且希望忽略来自污染您的版本控制(VSC)的符号链接,因为这些都会导致代码更改中的重复。 为了防止这在./src_cmake/上创建额外的./src_cmake/,如下所示
代码语言:javascript
复制
# 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项目工具箱中,您将设置范围(与Visual中的解决方案过滤器.slnf相同)
  2. 现在,在Edit scopes>Add(+)>Shared>中,只递归地包含这些路径,./src_cmake/ ./CMakeList.txt (当然,您可以包括/排除其他喜欢的.gitignore )
  3. 现在切换到新的作用域,您应该会得到一些可以从Visual C++传递项目视图的内容

XX。想一想回购根目录中的CMakeList ( .sln文件)和项目文件夹中的CmakeList (项目文件夹中的每个.vcxproj ),即不要用项目本地配置来污染根CMakeList

这样使MSVS和CMake保持同步,应该更容易一些。

但是,没有人应该手动完成所有这些操作,这样您就可以制作一个类似这样的简单脚本:

  1. 传递$SRCROOT (MSVS项目目录) so ./src$OUTROOT (CMake项目目录) so ./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上模拟过滤器结构,从那里您可以递归地迭代它,只使用target_include_directories()和源文件路径为每个子项目/目标生成基本的CMakeList.txt
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62924011

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档