背景
在使用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
函数定义中建模依赖关系的方式有关。
感谢所有人。
1条答案
按热度按时间eni9jsuy1#
如何更改CMake链接顺序?
至于目标源的链接顺序,请尝试重新排序参数。
至于库的链接顺序,您可以使用
target_link_options
和SHELL:
。这是一个有记录的功能吗?
号
我能相信这种行为吗?
一般来说,是的,我从来没有见过cmake重新排序对象文件。
嵌入式系统领域被__weak函数重定义所困扰
我不同意。
为什么链接顺序对我很重要
weak
符号出现问题的是 static libraries 的链接顺序。在现代cmake中使用OBJECT
libraries,在旧cmake中使用--whole-archive
linker flag。使用whole-archive
时,请注意LINK_INTERFACE_MULTIPLICITY。