2014-04-24 143 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) 

這種方式可以爲不同的源文件包含不同的目錄;將它們打包在庫中,並將最終目標與庫鏈接起來