我正在构建一个依赖于其他静态库的库,为了进行测试,我必须更换一个测试版本的库。对于我的生活,我无法解决如何用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)?
答案 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
目标属性稍后操纵库依赖项。
因此,在您的情况下,您可以删除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)