2016-08-12 162 views
3

我正在構建一個依賴於其他靜態庫的庫,用於測試,我必須更改其中一個庫以用於測試版本。對於我的生活,我無法解決如何使用CMake做到這一點。在CMake中更改庫依賴關係

我的CMake的設置是類似以下內容:

add_library(X STATIC x.cpp) 

add_library(Y STATIC y.cpp) 

add_library(A STATIC a.cpp) 
target_link_libraries(A X Y) 

add_executable(EXE main.cpp) 
target_link_libraries(EXE A) 

這工作得很好,但現在我想創建一個使用TEST_X代替X.這是一個簡單的例子另一個可執行文件,但我有一個非常來自遺留系統的複雜依賴關係。

那麼,如何構建一個與不同庫鏈接的新可執行文件(TEST_X而不是X)呢?

回答

2

據我正確理解,你想要一個可執行文件TEST_EXE取決於庫A,它不依賴於庫X而是TEST_X,對吧?

我沒有看到任何其他方式比在一個新的可執行TEST_EXE創建取決於TEST_X而不是X新庫的目標TEST_A並使用這個新的TEST_A

add_library(TEST_X STATIC test_x.cpp) 
add_library(TEST_A STATIC a.cpp) 
target_link_libraries(TEST_A TEST_X Y) 
add_executable(TEST_EXE main.cpp) 
target_link_libraries(TEST_EXE TEST_A) 
+0

是的,這是正確的,該解決方案將工作......但我我想不必定義額外的TEST_A庫。 –

+0

將'X'庫封裝在條件中,並將_test_版本定義爲實際版本,反之亦然。即沒有改變名稱,只是其他來源。 –

1

如果設置CMP0022政策NEW ,「INTERFACE_LINK_LIBRARIES」定義鏈接接口。「。這允許您稍後通過INTERFACE_LINK_LIBRARIES目標屬性操作庫依賴關係。

所以你的情況,你可以直接刪除的A依賴於X,並添加想要的庫依賴於你的可執行目標:

cmake_minimum_required(VERSION 2.8) 
project(ChangeLibDeps) 

cmake_policy(SET CMP0022 NEW) 

add_library(X STATIC x.cpp) 
add_library(TEST_X STATIC test_x.cpp) 

add_library(Y STATIC y.cpp) 

add_library(A STATIC a.cpp) 
target_link_libraries(A X Y) 

get_target_property(_libs A INTERFACE_LINK_LIBRARIES) 
list(REMOVE_ITEM _libs X) 
set_target_properties(A PROPERTIES INTERFACE_LINK_LIBRARIES ${_libs}) 

add_executable(EXE main.cpp) 
target_link_libraries(EXE A X) 

add_executable(TEST_EXE main.cpp) 
target_link_libraries(TEST_EXE A TEXT_X)