2014-04-24 144 views
1

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

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/...,这同样也是模糊不清的。

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

+0

您使用的是什么编译器? – Alex

+0

我正在使用gcc 4.7.3 – trianta2

回答

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。

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) 

这种方式可以为不同的源文件包含不同的目录;将它们打包在库中,并将最终目标与库链接起来