2016-06-09 112 views
2

我有一個C++庫項目,它附帶一個examples文件夾。這些例子是獨立的,即它們可以在沒有源碼樹的其餘部分的情況下編譯,就好像它們是使用該庫的真實應用程序一樣。他們使用提供的FindMyLib.cmake在系統中查找已安裝的庫。是否可以將cmake項目鏈接到子項目?

我想能夠與整個圖書館一起構建它們。起初,我加入他們作爲子目錄:

if(MYLIB_BUILD_EXAMPLES) 
    add_subdirectory(examples/fooexample) 
    add_subdirectory(examples/barexample) 
endif() 

但是,這是行不通的,因爲我不能用find_package安裝庫之前。我可以將默認構建目錄添加到搜索路徑中,但這還不夠,因爲在cmake運行時顯然沒有構建庫。

我能做些什麼來解決這個問題?有沒有一種方法可以在構建庫時透明地將庫鏈接到這些子項目(還可以「禁用」find_package,因爲它必然會在沒有安裝的情況下失敗)。

回答

2

剛準備FindMyLib.cmake,可鏈接到使用構建樹庫,而不是一個安裝之一。例如,它可能變MyLib_LIBRARY變量設置爲庫目標

cmake的建造/ FindMyLib.cmake

set(MyLib_LIBRARY MyLib) 
set(MyLib_INCLUDE_DIRECTORIES ${CMAKE_SOURCE_DIR}/include) 
... 

然後在前面加上CMAKE_MODULE_PATH清單與目錄,包含假腳本。這樣的方式,將用於例子:

if(MYLIB_BUILD_EXAMPLES) 
    set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake-build ${CMAKE_MODULE_PATH}) 
    add_subdirectory(examples/fooexample) 
    add_subdirectory(examples/barexample) 
endif() 
+0

除非我錯過了什麼,這是不行的:爲例子的配置步驟會導致一個錯誤,因爲該庫將不會被尚未建成, – piwi

+0

如果庫中添加(用'add_library(MyLib中)' )*之前*'add_subdirectory(examples/...)',然後'target_link_libraries(fooexample $ {MyLib_LIBRARY})'像往常一樣與** target **鏈接。圖書館目標不需要在這個階段建立。 – Tsyvarev

+0

我的不好,謝謝澄清。 – piwi

1

一個解決辦法是檢查,在你的例子,即建立MyLib目標是否存在,並使用它,如果它不依賴;否則調用find_library()

add_library(MyLib ...) 

# examples/fooexample 
if(NOT TARGET MyLib) 
    find_library(MyLib) 
endif() 

add_executable(foo) 

if(TARGET MyLib) 
    add_dependencies(foo MyLib) 
endif()