更改CMake构建中的库依赖项

时间:2016-08-12 01:38:51

标签: c++ 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 个答案:

答案 0 :(得分:2)

据我所知,您需要一个可执行文件TEST_EXE,具体取决于库A,它不依赖于库X,而是TEST_X,对吧? / p>

除了TEST_A而不是TEST_X并在新的X中使用这个新TEST_A之外,我没有看到任何其他方式而不是创建新的库目标TEST_EXE可执行文件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)

IsMailSent

答案 1 :(得分:2)

如果您将CMP0022政策设为NEW,则INTERFACE_LINK_LIBRARIES会定义链接界面。“这允许您通过INTERFACE_LINK_LIBRARIES目标属性稍后操纵库依赖项。

因此,在您的情况下,您可以删除AX的依赖关系,并将所需的库依赖项直接添加到可执行目标:

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)