CMake和C源层次结构

CMake和C源层次结构,c,cmake,directory-structure,C,Cmake,Directory Structure,在我的大多数项目中,我习惯于以下结构: src/ inc/ ext/ build/ [...] CMakeLists.txt README LICENCE 其中,src是我的源代码所在的目录,inc是标题,ext是放置外部库的地方(然后由CMake构建) 这个结构看起来不太好,因为我面临以下问题: 我正在写图书馆 在我的inc目录中,所有的我的头都是,私有的和公共的头 在我的CMakeLists.txt中,我使用了如下内容: target_include_directories(${PROJ

在我的大多数项目中,我习惯于以下结构:

src/
inc/
ext/
build/
[...]
CMakeLists.txt
README
LICENCE
其中,
src
是我的源代码所在的目录,
inc
是标题,
ext
是放置外部库的地方(然后由CMake构建)


这个结构看起来不太好,因为我面临以下问题:

  • 我正在写图书馆

  • 在我的
    inc
    目录中,所有的我的头都是,私有的公共的

  • 在我的
    CMakeLists.txt中,我使用了如下内容:

    target_include_directories(${PROJECT_NAME}
        PUBLIC
            inc
    )
    
  • 问题是,现在所有的头都被传播到超级项目,甚至是私有项目。一个可能的解决方案是在
    inc
    内有一个
    private
    public
    文件夹,因此:

    src/
    inc/
      private/
      public/
    ext/
    build/
    [...]
    CMakeLists.txt
    README
    LICENCE
    
    然后我可以使用:

    target_include_directories(${PROJECT_NAME}
        PUBLIC
            inc/public
        PRIVATE
            inc/private
    )
    

    问题是,是否有人能想到任何严肃的权衡?也许CMake甚至有一个“建议的层次结构”?

    老实说,我不是CMake的粉丝。我使用GNU make,它与我的操作系统捆绑在一起,我很高兴,我的代码对协作者的要求更少

    但撇开CMake不谈,我会重新参观这个建筑

    您的文件夹结构虽然并不少见,但与库或其组件无关。它不会为未来的维护人员提供任何可用信息

    考虑以下源代码结构:

    src
    src/io
    src/http
    src/pubsub
    src/database
    
    突然,没有阅读一行代码,我就有了一个关于应用程序(或库)可能是什么以及在哪里可以找到我可能需要查看的每个组件的强烈提示

    看看这个例子

    在库中,这通常更重要,因为(希望)许多人会阅读代码并做出贡献

    因此,您可能会问,include文件夹放在哪里?

    将头文件与源文件分离的问题是,这会使维护更加困难

    我建议使用脚本或使用
    make
    动态创建
    usr/include
    (用于安装的公共include文件)。。。但是由于您使用CGUD,请考虑指定每个公共标头,或者:


    另一个常见的选项是,假定公共头与实现头明显分开(即,包含API限制,除非在主要修订期间,否则不进行编辑),将它们放在一个单独的
    include
    文件夹中。

    将私有头存储在
    src
    中,并使用
    #include“…”
    用于包含它们。在
    inc
    中存储仅限公共的标题,并使用
    #include<…>用于包含它们。@KamilCuk肯定是一个有效的解决方案,然后我将在
    目标目录(…)
    中添加
    src/
    作为
    私有
    即使没有必要。我将删除此问题,因为没有人对其进行投票-因此我不允许再问任何问题。。。如果有人反对删除,请告诉我。