CMake包括目录冲突

时间:2014-04-24 18:19:22

标签: c++ cmake

在我的项目中,我有两个版本的同一系统库:SysLib1.0SysLib2.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.0SysLib2.0在自己的库中查找标题时都将自己称为syslib/...,这同样含糊不清。

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

2 个答案:

答案 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)

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