CMake 和 C 源层次结构

CMake and C source hierarchy

我在我的大部分项目中习惯了以下结构:

src/
inc/
ext/
build/
[...]
CMakeLists.txt
README
LICENCE

其中 src 是我的源代码所在的目录, inc 是 headers, ext 是放置外部库的地方(然后由 CMake 构建)。


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

  1. 我正在写一个库。

  2. 在我的 inc 目录 all 我的 headers 是 privatepublic个.

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

    target_include_directories(${PROJECT_NAME}
        PUBLIC
            inc
    )
    

问题是,现在 所有 headers 都传播到 super-project,甚至是私有的。一个可能的解决方案是在 inc 中有一个 privatepublic 文件夹,因此:

src/
inc/
  private/
  public/
ext/
build/
[...]
CMakeLists.txt
README
LICENCE

然后我可以使用:

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

问题是是否有人能想到任何严重的trade-offs?也许 CMake 甚至还有 "suggested hierarchy"?

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

但除了 CMake,我会 re-visit 结构。

您的文件夹结构虽然并不少见,但并未说明库或其组件。它不向未来的维护者提供任何可用信息。

考虑以下源代码结构:

src
src/io
src/http
src/pubsub
src/database

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

例如看Linux repo

在图书馆中,这通常更为重要,因为(希望)很多人会阅读代码并做出贡献。

所以你可能会问include 文件夹去哪里了?...

将 header 文件与源文件分开的问题是它使维护更加困难。

我建议使用脚本或 make 动态创建 usr/include(public 包含用于安装的文件)...但是由于您使用的是 CMake,考虑指定每个 public header 或:

另一个常见选项,它假定 public header 与实现 header 明显分开(即包含 API 限制并且不除了在主要修订期间编辑过),就是将它们放在单独的 include 文件夹中。