在这里,有一个使用一些外部GNU工具链构建的库(没有提供源代码)的项目。我正在为嵌入式系统(特别是FreeRTOS)编译一个应用程序,所以我使用newlib。
我最初尝试使用这个工具链 https://releases.linaro.org/components/toolchain/binaries/7.4-2019.02/aarch64-elf/ 但由于其中包含的链接错误等问题,导致失败。
undefined reference to `__ctype_ptr__'
看起来,这个符号应该由libc定义。 进入newlib sysroot,特别是在这种情况下,sysroot-newlib-linaro-2019.02-aarch64-elf \ usr \ lib目录,尝试在libc.a中找到__ctype_ptr__:
aarch64-elf-nm -C --defined-only -g libc.a | grep __ctype_ptr__
没有输出,因此这个libc确实没有定义__ctype_ptr__。
继续通过查看需要该符号的库,一个Notepad ++编辑显示以下内容:
/opt/gcc-linaro-5.4.1-2017.05-x86_64_aarch64-elf/aarch64-elf/libc/usr/include/machine
这意味着该库是使用5.4.1 aarch64-elf工具链版本构建的,而我正在尝试使用版本7.4,因为我需要更高的C++标准支持。同时也下载了5.4.1版本(仅sysroot):https://releases.linaro.org/components/toolchain/binaries/5.4-2017.05/aarch64-elf/ 。再次进入5.4.1的sysroot-newlib-linaro-2017.05-aarch64-elf\usr\lib目录。
aarch64-elf-nm -C --defined-only -g libc.a | grep __ctype_ptr__
最终揭示:
0000000000000000 D __ctype_ptr__
这意味着确实 5.4.1 newlib libc 导出了该符号。
问题:
为什么会有这种2个版本之间的不兼容性?这些更改属于哪个类别?我在哪里可以找到更详细的关于这些更改以及它们存在的原因的信息?
我是否被迫使用旧版本,因为那些库是用旧版构建的?没有办法使用更新的版本吗?通常如何处理这些情况?