我尝试创建一个 cmake 自定义目标以将多个 .a 文件合并为一个。请注意,我无法使用 OBJECTS lib 模式,因为我有很多 3rd 方库(我处于复杂的环境中,conan、cmake 等...)。

所以我写了以下内容

add_custom_target(combineall
    COMMAND echo "extract all .o files from all lib*.a file in the static folder"
    COMMAND for f in *.a ; do ar -x $f ; done
    COMMAND echo "merge all .o files in the static folder"
    COMMAND for f in *.o ; do ar -rs ${CMAKE_BINARY_DIR}/libmerged.a $f ; done
    WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/static
    DEPENDS MyLib
    )

但是当 cmake 运行 combineall 自定义目标时,我收到以下错误消息:



我想它来自 $f 。我知道我可以编写一个完全不同的 cmake 脚本,使用 cmake for_each 语法迭代其他人的 .a 文件,但这不是我的目标!

问候,
亚历克斯

最佳答案

你必须反斜杠转义你的分号,并用 $-escape 你的 $。 CMake 正在从命令中删除它们,因此 bash 看到 for f in *.a do ar -x done ,它因您看到的错误而失败。

所以你的目标应该是:

add_custom_target(combineall
    COMMAND echo "extract all .o files from all lib*.a file in the static folder"
    COMMAND for f in *.a \; do ar -x $$f \; done
    COMMAND echo "merge all .o files in the static folder"
    COMMAND for f in *.o \; do ar -rs ${CMAKE_BINARY_DIR}/libmerged.a $$f \; done
    WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/static
    DEPENDS MyLib
    )

关于shell - CMake COMMAND shell 参数替换失败,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47219387/

10-14 17:23
查看更多