使用CMake为嵌入式系统交叉编译可执行文件时,我需要手动添加链接选项以链接libc,libgcc和whatnot。但是,为此使用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
链接库。