【发布时间】:2023-03-31 16:53:02
【问题描述】:
我有一组汇编文件,应该由特殊的编译器编译。在此之后,它应该被添加到我在CMAKE_C_COMPILER 中设置的编译器创建的库中。它在 Mingw Makefile 系统上运行良好,但与 Ninja Make 不兼容。
下面是cmakelists.txt中的代码
add_custom_target(
special_asm
COMMAND
${SPECIAL_ASM} ${src_file1}
-I${INCLUDE_PATH} -o file1.o
COMMAND
${SPECIAL_ASM} ${src_file2}
-I${INCLUDE_PATH} -o file2.o
)
add_custom_target(special_asm_cmd COMMAND cmd.exe special_asm*.bat)
add_dependencies(special_asm_cmd special_asm)
add_library(
mylib STATIC
file1.o
file2.o
${mylib_src})
add_dependencies(mylib special_asm_cmd)
set_source_files_properties(
file1.o
file2.o
PROPERTIES EXTERNAL_OBJECT true GENERATED true)
file1.o 和file2.o 是由不同的汇编程序生成的。我也为这些文件设置了属性。
问题 1:
自定义目标 special_asm 不直接生成目标文件。它正在生成一个批处理脚本。这就是为什么我创建了另一个名为 special_asm_cmd 的自定义目标来运行将生成目标文件的批处理脚本。 Mingw make 系统直接从 special_asm 生成目标文件,但 Ninja 没有这样做。
问题 2
我为特殊生成的目标文件设置了属性 GENERATED true。但是忍者给出了以下错误。但是Mingw Make能够解决依赖并且没有错误
ninja: error: '<path>/spt_init.o', needed by '<path>/libmylib.a', missing and no known rule to make it
【问题讨论】:
-
与
Makefile生成器不同,知道“库mylib应该在自定义目标special_asm之后构建”就足够了,忍者需要知道谁(哪个目标)准确生成文件file1.o,这是mylib所需要的。在 CMake 中,通过add_custom_command的OUTPUT选项搜索文件的生产者。该命令的文档包含在add_library中使用生成文件的examples。 -
它有效.. 谢谢@Tsyvarev
标签: cmake ninja cmake-language cmakelists-options