Shell CMake命令外壳参数替换失败

Shell CMake命令外壳参数替换失败,shell,cmake,Shell,Cmake,我尝试创建一个cmake自定义目标,将多个.a文件合并为一个文件。请注意,我不能使用对象lib模式,因为我有很多第三方库(我在一个复杂的环境中,如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 ; d

我尝试创建一个cmake自定义目标,将多个.a文件合并为一个文件。请注意,我不能使用
对象
lib模式,因为我有很多第三方库(我在一个复杂的环境中,如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
自定义目标时,我会收到以下错误消息:

从静态文件夹中的所有lib*.a文件中提取所有.o文件 /bin/sh:-c:第1行:语法错误:文件意外结束

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

问候,,
Alex

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

所以你的目标应该是:

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变量,如:
for f in*.a;do ar-x“$f”;完成
。不知道这是否会改变
cmake
上下文中的任何内容,但您可以尝试一下。Hi@Nepho我已经尝试过了,但以相同的方式失败。另一个选项是将脚本放入文件中,并从cmake调用脚本文件。