【发布时间】:2020-09-25 15:32:14
【问题描述】:
使用 CMake 为嵌入式系统交叉编译可执行文件需要我手动添加链接选项以链接 libc、libgcc 等。但是,为此使用 target_link_options 会导致链接器调用,其中所有这些附加链接选项都添加到从我的实际代码生成的所有目标文件的前面。我认为这是错误的链接顺序,每当我尝试覆盖标准库中的弱符号(例如 __cxa_pure_virtual)时,它都会导致“重复符号错误”。
这是我从链接阶段获得的输出示例
"/usr/bin/ld.lld"
--gc-sections
/usr/arm-none-eabi/lib/crt0.o
/usr/lib/gcc/arm-none-eabi/10.1.0/thumb/v7e-m+fp/hard/crti.o
/usr/lib/gcc/arm-none-eabi/10.1.0/thumb/v7e-m+fp/hard/crtbegin.o
/usr/lib/gcc/arm-none-eabi/10.1.0/thumb/v7e-m+fp/hard/crtn.o
/usr/lib/gcc/arm-none-eabi/10.1.0/thumb/v7e-m+fp/hard/crtend.o
--start-group -lstdc++_nano -lm -lgcc -lc_nano --end-group
my.obj ///< Shoudln't object files and application libs be linked first?
libmylib.a
-Bstatic
-L/usr/lib/clang/10.0.0/lib/baremetal
-L/usr/arm-none-eabi/lib/thumb/v7e-m+fp/hard/
-L/usr/lib/gcc/arm-none-eabi/10.1.0/thumb/v7e-m+fp/hard/
-T ldscript.ld
-o myelf
有没有办法在 CMake 中解决这个问题?
【问题讨论】:
-
将
target_link_options替换为target_link_libraries。the wrong linking order顾名思义,target_link_options将 options 添加到链接器。通常选项是在其他任何事情之前指定的。and it causes "duplicate symbol errors"我猜这是由--start-group/--end-group选项引起的。 -
嗯,这是一个快速修复。如果您将其发布为答案,我很乐意接受。
-
链接器选项通常添加在对象之前,但并非总是如此。
标签: cmake linker embedded linker-errors static-linking