如何更改CMake源文件的目标文件链接顺序?

问题描述 投票:0回答:1

背景

使用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
函数定义中建模依赖项的方式有关。

谢谢大家。


c cmake
1个回答
4
投票

如何更改 CMake 链接顺序?

就目标源的链接顺序而言,请尝试重新排序参数。

至于库的链接顺序,可以使用

target_link_options
SHELL:

这是一个已记录的功能吗?

没有。

我可以依赖这种行为吗?

通常是的,我从未见过 cmake 重新排序目标文件。

嵌入式系统领域受到 __weak 函数重新定义的困扰

我不同意。

为什么链接顺序对我很重要

目标文件的链接顺序无关紧要 - 所有符号均一次性加载。导致

weak
符号出现问题的是 静态库 的链接顺序。在现代 cmake 中使用
OBJECT
库,在旧版 cmake 中使用
--whole-archive
链接器标志。使用
whole-archive
时,请注意 LINK_INTERFACE_MULTIPLICITY

© www.soinside.com 2019 - 2024. All rights reserved.