gpt4 book ai didi

C++ 项目 : Artifact-Name dependant "include" directory population using CMake (build-time)

转载 作者:太空宇宙 更新时间:2023-11-04 12:12:43 29 4
gpt4 key购买 nike

我已经为我目前成功使用的新项目设计了一个很好的结构。

注意:这种结构有利于由多个程序员开发的项目。

<Project Directory>
+ include
+ Haroogan
+ Utility
- util.h
+ More
- more.h
+ Whatever
- whatever.h

+ src
+ Haroogan.More <--- Artifact
- more.h
- more.cpp
- CMakeLists.txt
+ Haroogan.More.Whatever <--- Artifact
- whatever.h
- whatever.cpp
- CMakeLists.txt
+ Haroogan.Utility <--- Artifact
- util.h
- util.cpp
- CMakeLists.txt
+ Haroogan.Application <--- Artifact
- app.h
- app.cpp
- CMakeLists.txt
- CMakeLists.txt <--- "Root" CMakeLists.txt

神器 - 是库、可执行文件等 - 你明白了。

工件名称 (如主题) - 只是工件的名称,它是由 CMake 从专用于工件的目录的名称推导出来的。实际上术语 Artifact 和 Artifact-Name 本质上是相同的。例如:位于目录“Haroogan.More.Whatever”中的工件具有名称“Haroogan.More.Whatever”。

这有几个后果:
  • 构建后生成的库、可执行文件等将使用 Artifact-Name 命名;
  • 所有与特定工件相关的源代码都包含在与工件名称相对应的 namespace 中。例如:工件“Haroogan.More.Whatever”将“Haroogan::More::Whatever”命名空间强加于其所有源;
  • 当一个工件想要使用另一个工件时,必须包含另一个工件的 header 并可选择链接到它。但是,我们都知道写作 #include "../Haroogan.More/more.h"不仅看起来凌乱,而且还打破了工件实际上代表独立组件的基本思想,即使在文件系统方面也必须解耦。此外,私有(private) header 的概念也被打破,因为这样我可以访问其他工件中的任何 header 。

  • 我们这里需要的只是一个 公共(public) header 存储库 - “包含”目录。因此,为了解决最后一个问题 - 我决定执行以下操作:
  • 每个工件都自行决定(当然在其 CMakeLists.txt 中)要导出到外部世界的 header ;
  • 然后它将这些头文件复制(在每个构建中,但当然只在需要时)复制到“include”中的相应目录。例如,如果 Artifact-Name 是“Haroogan.More.Whatever”,那么 header 将被复制到“include/Haroogan/More/Whatever/”目录(如上所示)。

  • 我相信从现在起,如果我想在其他组件中使用“Haroogan.More.Whatever”和“Haroogan.More”工件中的“whatever”和“more”类,这是一种很好且强大的方法 - 我只是写:
    #include <Haroogan/More/Whatever/whatever.h>
    #include <Haroogan/More/more.h>

    using Haroogan::More::Whatever::whatever;
    using Haroogan::More::more;

    该系统就像一个魅力(如果有人愿意,我可以提供 CMake 脚本)。但是,我对标题被复制的事实并不满意。例如,如果不是复制“whatever.h”,CMake 会在“Haroogan/More/Whatever/”和 中创建新文件“whatever.h”,这会更好。注入(inject) #include "../../../../src/Haroogan.More.Whatever/whatever.h"在里面。

    我的系统现在是完全自动化的。换句话说,路径“Haroogan/More/Whatever”是从工件名称“Haroogan.More.Whatever”自动推导出来的。因此,如果 就好了。注入(inject) #include "../../../../src/Haroogan.More.Whatever/whatever.h"和所有那些讨厌的 ../../也将是自动化的。

    不幸的是,我是 CMake 新手,不知道如何实现此功能,但我认为这是可能的,并且可能已经有人完成了。谢谢你。

    编辑:

    此问题的临时解决方案可能如下:

    而不是在“Haroogan/More/Whatever/”中创建“whatever.h”,这会立即导致处理 ../../困惑,我可以简单地在“include”目录中创建“Haroogan.More.Whatever.whatever.h”(通过在“whatever.h”前加上“Haroogan.More.Whatever”)并将其用作:
    #include <Haroogan.More.Whatever.whatever.h>

    using Haroogan::More::Whatever::whatever;

    这个解决方案是可以接受的,但我不像我感兴趣的那样喜欢它。

    最佳答案

    这个怎么样:

    macro(add_public_headers)
    foreach(header ${ARGN})
    get_filename_component(abspath ${header} ABSOLUTE)
    file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/${header} "#include ${abspath}"
    endforeach()
    endmacro()

    这个 maro 现在可以这样使用:

    src/Haroogan.More.Whatever/CMakeLists.txt你做
    add_public_headers(whatever.h)

    这将在您的构建目录中生成带有单个#include 行的标题。

    唯一的问题是该路径将是绝对的,但这对您来说应该不是问题。

    关于C++ 项目 : Artifact-Name dependant "include" directory population using CMake (build-time),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9162837/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com