2013-01-17 100 views
0

工作,該項目已大致有以下幾種結構:包括CMAKE_CURRENT_BINARY_DIR不適用於子目錄

include/ 
    lib_name/ 
    public_foo.h 
    public_bar.h 
src/ 
    CMakeLists.txt 
    foo.c 
    foo.h 
    bar.c 
    bar.h 
CMakeLists.txt 

頂級CMakeLists.txt文件定義的共享庫目標

add_library(lib_name SHARED "src/foo.c" "src/bar.c") 

與此同時,有自定義命令

add_custom_command(OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/src/foo-impl.c" ...) 

產生的在構建目錄由這樣的foo.c」包括:

#include <some_header.h> 
#include <other.h> 

#include "foo-impl.c" 

爲了能夠包括foo-impl.c我在src/CMakeLists.txt

include_directories("${CMAKE_CURRENT_BINARY_DIR}") 

下看起來它應該工作, 對?

嗯,它不起作用 - src目錄不會被添加到foo.c的編譯器標誌。看起來include目錄隻影響在同一目錄(或子目錄)中定義的目標。

我知道我可以做

include_directories("${CMAKE_CURRENT_BINARY_DIR}/src") 

從根CMakeLists.txt(其實,這是我正在做的時刻),但是這是不能接受的:每一個子目錄將看到父母的文件和這最終可能導致文件名衝突。

人們在大型項目中如何克服這一點?或者我做錯了什麼?

回答

1

與大多數cmake命令一樣,include_directories僅影響該目錄和子目錄中的目標。而且IIRC只是在命令之後定義的目標。這是故意的。這是你如何爲不同的模塊定義不同的標誌。

當我說像大多數cmake命令時,我的意思是最多。最重要的包括add_definitionsset,除了CACHE的說法。

還記得,include_directories蘋果目標,而不是文件。

要麼定義子目錄中的庫(最有意義的我),把一切都放在頂層CMakeLists.txt或設置只使用set_target_properties(lib_name PROPERTIES COMPILE_FLAGS "-I${CMAKE_BINARY_DIR}/src")目標的標誌(必須完成的目標被定義之後)。