首页 > 解决方案 > CMake分别为每个对象执行归档程序

问题描述

我想在 cmake 中创建一个带有存档器(来自 arduino,esp8266)的库。

add_library(arduino_core STATIC ${CORE_ASM_ITEMS} ${CORE_C_ITEMS} ${CORE_CXX_ITEMS})

我设置的这些选项,特别是 CMAKE_AR

set(CMAKE_C_COMPILER "${TOOLCHAIN_BIN}/${TARGET_TRIPLET}-gcc${SYSTEM_EXTENSION}")
set(CMAKE_CXX_COMPILER "${TOOLCHAIN_BIN}/${TARGET_TRIPLET}-g++${SYSTEM_EXTENSION}")
set(CMAKE_ASM_COMPILER "${TOOLCHAIN_BIN}/${TARGET_TRIPLET}-gcc${SYSTEM_EXTENSION}")
set(CMAKE_AR "${TOOLCHAIN_BIN}/${TARGET_TRIPLET}-ar${SYSTEM_EXTENSION}")

SET(CMAKE_CXX_ARCHIVE_CREATE "<CMAKE_AR> cru <TARGET> <LINK_FLAGS> <OBJECTS>")
SET(CMAKE_C_ARCHIVE_CREATE "<CMAKE_AR> cru <TARGET> <LINK_FLAGS> <OBJECTS>")

如果我用 make 构建这个库,它将执行:

/Users/XXX/Library/Arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/2.5.0-3-20ed2b9/bin/xtensa-lx106-elf-ar cru libarduino_core.a  CMakeFiles/arduino_core.dir/Users/XXX/Library/Arduino15/packages/esp8266/hardware/esp8266/2.5.0/cores/esp8266/cont.S.o CMakeFiles/arduino_core.dir/Users/XXX/Library/Arduino15/packages/esp8266/hardware/esp8266/2.5.0/cores/esp8266/StackThunk.c.o

最后还有更多的对象(大约 60 个)。但我认为归档器不想要这种语法。如果我最后链接这个构建的库,它会因为未定义的引用而失败。

但是如果我手动构建库,给每个对象一个自己的归档器执行,如下所示,最后链接库是成功的。

/Users/XXX/Library/Arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/2.5.0-3-20ed2b9/bin/xtensa-lx106-elf-ar cru libarduino_core.a CMakeFiles/arduino_core.dir/Users/XXX/Library/Arduino15/packages/esp8266/hardware/esp8266/2.5.0/cores/esp8266/cont.S.o
/Users/XXX/Library/Arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/2.5.0-3-20ed2b9/bin/xtensa-lx106-elf-ar cru libarduino_core.a CMakeFiles/arduino_core.dir/Users/XXX/Library/Arduino15/packages/esp8266/hardware/esp8266/2.5.0/cores/esp8266/StackThunk.c.o
...

所以我的问题是:是否有任何 CMake 选项可以限制例如给定对象的数量?或者类似的东西?

标签: cmakeunix-ar

解决方案


推荐阅读