【发布时间】:2021-11-05 12:07:25
【问题描述】:
我在 MCUXpresso 中有一个带有自定义链接器文件的项目。该项目在 Windows 上构建良好,但在 Linux 上失败。在 Linux 上,链接器失败并出现以下错误(编译器路径被缩短):
arm-none-eabi/bin/ld: arm-none-eabi/lib/thumb/v7-m/nofp/libc_nano.a(lib_a-abort.o): in function `abort':
abort.c:(.text.abort+0xa): undefined reference to `_exit'
arm-none-eabi/bin/ld: arm-none-eabi/lib/thumb/v7-m/nofp/libc_nano.a(lib_a-signalr.o): in function `_kill_r':
signalr.c:(.text._kill_r+0xe): undefined reference to `_kill'
arm-none-eabi/bin/ld: arm-none-eabi/lib/thumb/v7-m/nofp/libc_nano.a(lib_a-signalr.o): in function `_getpid_r':
signalr.c:(.text._getpid_r+0x0): undefined reference to `_getpid'
arm-none-eabi/bin/ld: arm-none-eabi/lib/thumb/v7-m/nofp/libc_nano.a(lib_a-writer.o): in function `_write_r':
writer.c:(.text._write_r+0x10): undefined reference to `_write'
arm-none-eabi/bin/ld: arm-none-eabi/lib/thumb/v7-m/nofp/libc_nano.a(lib_a-closer.o): in function `_close_r':
closer.c:(.text._close_r+0xc): undefined reference to `_close'
arm-none-eabi/bin/ld: arm-none-eabi/lib/thumb/v7-m/nofp/libc_nano.a(lib_a-fstatr.o): in function `_fstat_r':
fstatr.c:(.text._fstat_r+0xe): undefined reference to `_fstat'
arm-none-eabi/bin/ld: arm-none-eabi/lib/thumb/v7-m/nofp/libc_nano.a(lib_a-isattyr.o): in function `_isatty_r':
isattyr.c:(.text._isatty_r+0xc): undefined reference to `_isatty'
arm-none-eabi/bin/ld: arm-none-eabi/lib/thumb/v7-m/nofp/libc_nano.a(lib_a-lseekr.o): in function `_lseek_r':
lseekr.c:(.text._lseek_r+0x10): undefined reference to `_lseek'
arm-none-eabi/bin/ld: arm-none-eabi/lib/thumb/v7-m/nofp/libc_nano.a(lib_a-readr.o): in function `_read_r':
readr.c:(.text._read_r+0x10): undefined reference to `_read'
链接器文件最初“包含”以下静态库:
GROUP (
"libgcc.a"
"libc_nano.a"
"libm.a"
"libcr_newlib_none.a"
)
现在,我可以通过在 GROUP 语句中添加 "libnosys.a" 来让链接器成功完成其工作。这就是让我感到困惑的地方。为什么只在 Linux 上需要 libnosys.a 中的这些新存根?它们在 Windows 中是如何以及在哪里定义的?我错过了什么?
我的 Windows 和 Linux 上的 GCC 版本分别为 8.3.1 和 10.2.1,因为它们与不同版本的 MCUXpresso 捆绑在一起。
提前致谢!
【问题讨论】:
-
我认为 Windows 和 Linux 的库包括标准函数的不同实现。正如您在错误消息中看到的,所有错过的功能都非常低级。 Windows 实现可能不需要它们,因为它们可以直接调用 Win32 API 函数。
-
感谢您的评论。有什么文件可以确认吗?
-
您使用的“libc”(纳米)的文档是怎么说的?顺便说一句,你的目标是什么,原生 Linux 和 Windows,还是你在交叉编译?