背景
使用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
问题
目的:
嵌入式系统领域充满了
__weak
函数重定义、中断调用函数、内联汇编实现等。
编辑:
我意识到链接顺序并不重要。
我的问题与我在 CMake +
__weak
函数定义中建模依赖项的方式有关。
谢谢大家。
如何更改 CMake 链接顺序?
就目标源的链接顺序而言,请尝试重新排序参数。
至于库的链接顺序,可以使用
target_link_options
和 SHELL:
。
这是一个已记录的功能吗?
没有。
我可以依赖这种行为吗?
通常是的,我从未见过 cmake 重新排序目标文件。
嵌入式系统领域受到 __weak 函数重新定义的困扰
我不同意。
为什么链接顺序对我很重要
目标文件的链接顺序无关紧要 - 所有符号均一次性加载。导致
weak
符号出现问题的是 静态库 的链接顺序。在现代 cmake 中使用 OBJECT
库,在旧版 cmake 中使用 --whole-archive
链接器标志。使用 whole-archive
时,请注意 LINK_INTERFACE_MULTIPLICITY。