gpt4 book ai didi

c++ - 如何使用 CMake 订购/设计使用更高的共享库包括

转载 作者:行者123 更新时间:2023-11-28 02:43:35 27 4
gpt4 key购买 nike

目前我有一个包含大约 30 个类的共享库。我的想法是将它们分组到子目录中,这意味着子目录包含或多或少相等/具有相同内容(ui、utils、后端等)的类。

但我遇到了一个典型的问题:我有一些在整个项目中共享的导出定义/常量,我的第一个问题是:如何从子目录中的 header 中包含这个 header ?

我经常看到 #include ../Header.h 解决方案,但我个人认为,这非常丑陋。

所以我做了什么:

Application/
main.cpp
MyLibrary/
Header.h
foo/
Foo.h (#include <Header.h>
bar/
Bar.h (#include <Header.h> #include <foo/Foo.h>)

在我的库 CMakeList 中,我将 include_directory 添加到 MyLibrary 目录的根目录中。

我的应用程序可执行文件 CMakeLists.txt 看起来像这样(伪 CMake)

project(application)

include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../)

add_executable(application main.cpp)

target_link_libraries(application mylibrary)

main.cpp 中,我这样包含:

#include <MyLibrary/Header.h>
#include <MyLibrary/bar/Bar.h>

现在的问题是,编译器不知道在哪里寻找包含的 <> INSIDE 库,例如 foo 中的 Header.h 包含.bar 指向 ${CMAKE_CURRENT_SOURCE_DIR}/Header.h - 但是 CMAKE_CURRENT_SOURCE_DIR 是应用程序的路径而不是库的路径

所以我必须添加编译器可以找到库的其他 header 的库目录(库中的 header 通过<>而不是“”在库中包含另一个 header )

所以我最终得到了这样的结果:

include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../ ${CMAKE_CURRENT_SOURCE_DIR}/../MyLibrary)

现在Bar.h可以找到foo/Foo.h,否则就出问题了。而且这个更难看

所以我的问题是:在 CMake 中是否有解决此问题的好方法/技巧?或者有人可以给我一些关于更好的项目结构的建议吗?该解决方案必须在 MSVC、GCC 和 clang 下运行。

最佳答案

如果您考虑安装后库的外观,您可能会得到一些关于结构的提示。例如:

<install-prefix>/Foo/foo.hpp -> has `#include <Boo/boo.hpp>`
<install-prefix>/Boo/boo.hpp -> has `#include <Bar/bar.hpp>`
<install-prefix>/Bar/bar.hpp -> has `#include <Bar/details/utils.hpp>`
<install-prefix>/Bar/details/utils.hpp

这是安装完成前可能的布局:

<source-dir>/Sources/Foo/foo.hpp
<source-dir>/Sources/Boo/boo.hpp
<source-dir>/3rdParty/Bar/bar.hpp
<source-dir>/3rdParty/Bar/details/utils.hpp

因此 CMakeLists.txt 必须包含(或更好的 target_include_directories ):

include_directories(<source-dir>/Sources)
include_directories(<source-dir>/3rdParty)

所以对于你的情况,恕我直言,它一定是这样的:

Application/
main.cpp
MyLibrary/
Header.h
foo/
Foo.h (#include <MyLibrary/Header.h>
bar/
Bar.h (#include <MyLibrary/Header.h> #include <MyLibrary/foo/Foo.h>)

关于c++ - 如何使用 CMake 订购/设计使用更高的共享库包括,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25120637/

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