【问题标题】:CMake properties and expanding generator expressionsCMake 属性和扩展生成器表达式
【发布时间】:2015-07-25 05:14:02
【问题描述】:

我正在尝试将几个静态库与 CMake 结合起来,我发现一个 answer 建议执行以下操作:

SET_TARGET_PROPERTIES(merged PROPERTIES STATIC_LIBRARY_FLAGS "full\path\to\lib1.lib full\path\to\lib2.lib")

我想要组合的库是其他目标的输出,当我想要引用目标的输出时,我通常使用生成器表达式,例如 $。但是在这种情况下它不起作用,因为生成器表达式在传递给链接器之前没有得到扩展,并且它抱怨 $ 找不到。

这不起作用:

set_target_properties(merged PROPERTIES STATIC_LIBRARY_FLAGS $<TARGET_FILE:MyLib>)

我想我的意思是将属性设置为库的路径:

set_target_properties(merged PROPERTIES STATIC_LIBRARY_FLAGS ${CURRENT_BIN_DIR}/MyLib.lib})

手动生成这条路径可能很乏味(我有很多目标),我想知道给定目标是否有更好的方法来自动获取这条路径。

例如(我在这里编写语法):

set_target_properties(merged PROPERTIES STATIC_LIBRARY_FLAGS EXPAND_PATH($<TARGET_FILE:MyLib>))

【问题讨论】:

    标签: c++ cmake


    【解决方案1】:

    你说得对,generator expressions 是正确的选择——尤其是在多配置环境中——但如果某个命令或属性不支持它们,你就不能欺骗它们工作。

    但还有其他选择:

    设置ARCHIVE_OUTPUT_DIRECTORY属性

    您可以稍微改变您的“我想我注定要这样做”策略,并将您想要合并的库输出放置到您自己选择的路径中。以下示例适用于 Visual Studio 等多配置环境:

    add_library(lib1 STATIC bar.cc)
    set_target_properties(lib1 PROPERTIES ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/Libs")
    
    file(WRITE dummy.cc "")
    add_library(merged STATIC dummy.cc) 
    add_dependencies(merged lib1)
    
    set_target_properties(
        merged PROPERTIES 
            STATIC_LIBRARY_FLAGS_DEBUG   "${CMAKE_BINARY_DIR}/Libs/Debug/lib1.lib"
            STATIC_LIBRARY_FLAGS_RELEASE "${CMAKE_BINARY_DIR}/Libs/Release/lib1.lib"
    )
    

    使用 OBJECT

    或者您可以使用 OBJECT libraries 作为中间分组目标,以防止不得不欺骗 CMake 构建您的 merged 库:

    add_library(lib1 OBJECT bar.cc)
    add_library(lib2 OBJECT foo.cc)
    add_library(merged $<TARGET_OBJECTS:lib1> $<TARGET_OBJECTS:lib2>) 
    

    我个人更喜欢后者。

    【讨论】:

    • 感谢您的回答。我开始实施类似于您的第一个解决方案的东西,但第二个替代方案看起来更干净。我会检查它在我的项目中是如何工作的。
    猜你喜欢
    • 2021-11-26
    • 1970-01-01
    • 2022-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-12
    相关资源
    最近更新 更多