在我的项目中,我有两个版本的同一系统库:SysLib1.0
和SysLib2.0
。这两个库被系统的其他组件大量使用。
SysLib1.0
标题位于某个目录中:/project/include
。这是项目内容的一个示例,包括目录:
/project/include/syslib/
/project/include/awesomelib/
/project/include/coollib/
很自然地,在CMake中,其他组件使用include_directories(/project/include)
来访问系统和其他组件头。 C ++源代码可以像这样访问标题:
#include <syslib/importantheader.hpp>
SysLib2.0
安装在单独的位置,以避免链接问题。 SysLib2.0
的标题存储在此处:
/opt/SysLib2.0/include
很自然地,在CMake中,需要SysLib2.0
的其他组件使用include_directories(/opt/SysLib2.0/include)
。 C ++源代码可以像这样访问标题:
#include <syslib/importantheader.hpp>
现在我们遇到了问题。我写作的新组件需要访问/project/include
才能访问awesomelib
,但还需要SysLib2.0
。这也包括/opt/SysLib2.0/include
。现在,当我说#include <syslib/importantheader.hpp>
时,可以引用该库的任一版本。编译器会向我发出一些重新定义错误,但应该如此。
更糟糕的是,SysLib1.0
和SysLib2.0
在自己的库中查找标题时都将自己称为syslib/...
,这同样含糊不清。
有没有人知道如何从包含路径中排除特定目录?即使我包含一个父目录,如我的例子所示?任何解决方案或建议表示赞赏。
答案 0 :(得分:0)
我不喜欢为所有包含使用一个包含路径。我宁愿采用以下结构。
include - your own headers
include/awesomelib
include/coollib
3rd - third party libs
3rd/syslib-1.0/include
3rd/syslib-1.0/src
3rd/syslib-2.0/include
3rd/syslib-2.0/src
src - your source
src/awesomelib (depends on syslib-1.0, includes 3rd/syslib-1.0/include)
src/coollib (depends on syslib-2.0, includes 3rd/syslib-2.0/include)
然后,您可以指定在构建库时使用哪个syslib。
答案 1 :(得分:0)
您可以使用嵌套的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)
这样,您可以为不同的源文件包含不同的目录;将它们打包到库中并将最终目标与库链接