如何更改CMake链接顺序?

k5hmc34c  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(90)

背景

在使用CMake时,我注意到源代码定义顺序会影响链接顺序。
例如,考虑这个项目有3个源文件。

target_sources(my-project.elf PUBLIC
    alpha.c
    beta.c
    gamma.c
)

字符串
使用make VERBOSE=1,我们可以看到链接顺序与定义顺序完全相同:

[100%] Linking C executable my-project.elf
/usr/bin/cmake -E cmake_link_script CMakeFiles/my-project.elf.dir/link.txt --verbose=1
/usr/local/build_tools/gcc-6.3-arm32-eabi/bin/arm-none-eabi-gcc
[Some linker flags]
CMakeFiles/my-project.elf.dir/alpha.c.obj
CMakeFiles/my-project.elf.dir/beta.c.obj
CMakeFiles/my-project.elf.dir/gamma.c.obj
-o  my-project.elf

问题

  • 这是一个记录的功能吗?(意思是:我可以依赖这种行为吗?)
  • 有没有更好的方法来管理链接器顺序?(使用现代CMake)
    用途:

嵌入式系统领域充满了__weak函数重定义、从中断调用的函数、内联汇编实现等。

编辑:

我意识到连接顺序并不重要。
我的问题与我在CMake + __weak函数定义中建模依赖关系的方式有关。
感谢所有人。

eni9jsuy

eni9jsuy1#

如何更改CMake链接顺序?
至于目标源的链接顺序,请尝试重新排序参数。
至于库的链接顺序,您可以使用target_link_optionsSHELL:
这是一个有记录的功能吗?

我能相信这种行为吗?
一般来说,是的,我从来没有见过cmake重新排序对象文件。
嵌入式系统领域被__weak函数重定义所困扰
我不同意。
为什么链接顺序对我很重要

  • object files* 的链接顺序是无关紧要的-所有符号都是一次加载的。导致weak符号出现问题的是 static libraries 的链接顺序。在现代cmake中使用OBJECT libraries,在旧cmake中使用--whole-archive linker flag。使用whole-archive时,请注意LINK_INTERFACE_MULTIPLICITY。

相关问题