gpt4 book ai didi

c++ - CMake 属性和扩展生成器表达式

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:49:31 24 4
gpt4 key购买 nike

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

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

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

这不起作用:

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>))

最佳答案

你是对的 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>)

我个人更喜欢后者。

关于c++ - CMake 属性和扩展生成器表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31623207/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com