gpt4 book ai didi

c++ - CMake 包含目录冲突

转载 作者:太空宇宙 更新时间:2023-11-04 13:51:18 24 4
gpt4 key购买 nike

在我的项目中,我有同一个系统库的两个版本:SysLib1.0SysLib2.0 .这两个库被系统的其他组件大量使用。

SysLib1.0 header 位于某个目录中:/project/include .下面是项目包含目录的内容示例:

/project/include/syslib/
/project/include/awesomelib/
/project/include/coollib/

很自然地,在 CMake 中,其他组件使用 include_directories(/project/include)获得对系统和其他组件 header 的访问权限。 C++ 源代码可以像这样访问 header :

#include <syslib/importantheader.hpp>

SysLib2.0安装在单独的位置以避免链接问题。 SysLib2.0的 header 存储在这里:

/opt/SysLib2.0/include

很自然地,在 CMake 中,其他组件需要 SysLib2.0使用 include_directories(/opt/SysLib2.0/include) . C++ 源代码可以像这样访问 header :

#include <syslib/importantheader.hpp>

现在我们遇到了一个问题。我正在编写的一个新组件需要访问 /project/include为了访问awesomelib , BUT 还需要 SysLib2.0 .这涉及包括 /opt/SysLib2.0/include以及。现在当我说 #include <syslib/importantheader.hpp> ,它可以引用库的任一版本。编译器用一些重新定义错误对我大喊大叫,这是应该的。

更糟的是,SysLib1.0SysLib2.0都称自己为 syslib/...在他们自己的库中查找 header 时,这同样是模棱两可的。

有人知道如何从包含路径中排除特定目录吗?即使我包含示例中所示的父目录?任何解决方案或建议表示赞赏。

最佳答案

您可以使用嵌套的 CMakeLists.txt 文件为您的项目创建树状目录结构,并在不同的叶子中包含单独的目录:

给定一个目录结构:

A:
|main.cpp
|
|CMakeLists.txt
|
|B-----|
| |CMakeLists.txt
| |b.cpp
|
|C-----|
|CMakeLists.txt
|c.cpp

A/CMakeLists.txt:
add_subdirectory(B)
add_subdirectory(C)
add_executable(exe main.cpp)
target_link_libraries(exe a b)

B/CMakeLists.txt:
include_directories(/project/include)
add_library(b b.cpp)

C/CMakeLists.txt:
include_directories(/opt/SysLib2.0/include)
add_library(c c.cpp)

这样你可以为不同的源文件包含不同的目录;将它们打包到库中并将最终目标与库链接

关于c++ - CMake 包含目录冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23276785/

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