【问题标题】:change library dependencies in CMake build在 CMake 构建中更改库依赖项
【发布时间】:2016-08-12 01:38:50
【问题描述】:

我正在构建一个依赖于其他静态库的库,为了进行测试,我必须将其中一个库更改为测试版本。在我的一生中,我无法弄清楚如何使用 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)链接的新可执行文件?

【问题讨论】:

    标签: c++ cmake


    【解决方案1】:

    据我对您的正确理解,您想要一个依赖库A 的可执行文件TEST_EXE,它不依赖于库X 而是TEST_X,对吧?

    除了根据TEST_X 而不是X 创建新的库目标TEST_A 并在新的可执行文件TEST_EXE 中使用这个新的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)
    

    【讨论】:

    • 是的,这是正确的,这个解决方案可以工作......但我不想定义额外的 TEST_A 库。
    • 如何将X 库包装在条件中,或者将 test 版本定义为实际版本,反之亦然。 IE。无需更改名称,仅更改其他来源。
    【解决方案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)
    

    【讨论】:

    • 就我而言,我必须写list( REMOVE_ITEM _libs "\$<LINK_ONLY:libname>" )
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多