2017-08-03 68 views
1

BUCK構建工具允許我爲庫定義頭部命名空間。舉例來說,如果我有一個名爲力霸庫,該目錄結構:是否有一個等同於BUCK的header_namespace的cmake?

root 
    include 
     a.h 
    src 
     a.cpp 

我可以在圖書館的,比方說,examples/liba設置header_namespace,使得在使用力霸我可以在一個單獨的項目:

#include "examples/liba/a.h" 

這很好,因爲它允許我在我的項目中保留一個簡化的目錄結構,同時還保持我的包含以更具可讀性的方式組織。

CMake提供這樣的東西嗎?我還沒有找到類似的東西。我的目標是讓BUCK和CMake構建文件,以便在沒有Java的系統上構建(BUCK的依賴關係之一)。

回答

1

不,CMake沒有這樣的設施。

管理標頭的標準方法是在文件系統中組織它們,使它們不可能與其他代碼發生衝突。

root 
    include 
     liba 
      a.h 
    src 
     a.cpp 

然後,它是一個簡單的問題:

include_directories(include) 

或更好,

target_include_directories(liba PUBLIC include) 

,或者最現代的是,

target_include_directories(liba PUBLIC 
    "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>" 
    "$<INSTALL_INTERFACE:include>") 

這只是說讓在包含路徑上可用於使用的任何人當前源目錄中子目錄include的內容和任何安裝libainclude子目錄(相對於安裝前綴解釋)的內容的任何人。

然後安裝通常是這樣的:

install(DIRECTORY include/ 
    DESTINATION include) 

的頭,源下安裝的一切包括實際庫目標(「libliba.a」或「目錄和

install(TARGETS liba 
    RUNTIME DESTINATION bin 
    LIBRARY DESTINATION lib 
    ARCHIVE DESTINATION lib) 

libliba.so「)。更好的辦法是將include(GNUInstallDirs)的變量用於GNU標準文件夾名稱。

在你的代碼,在任何時候,你只是指代碼在平時無衝突的方法:

#include "liba/a.h" 

所以,有永遠不應該對文件或代碼的任何衝突,除非你真的是壞命名!

+0

夠公平的,謝謝你提供的所有信息!我肯定會相應地更新我的策略。 – Craig

相關問題