这里有一个项目,该项目使用一些外部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 目录,试图在其中找到__ctype_ptr__ libc.a :
aarch64-elf-nm -C --defined-only -g libc.a | grep __ctype_ptr__
无输出,因此此libc 实际上未定义__ctype_ptr __ 。
继续查看需要符号的库 ,记事本++编辑显示,其中包含以下内容:
/opt/gcc-linaro-5.4.1-2017.05-x86_64_aarch64-elf/aarch64-elf/libc/usr/include/machine
这意味着该库是使用 5.4.1 aarch64-elf工具链版本构建的,并且自< strong>我需要更新的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 会导出该符号。
问题:
为什么两个版本之间的这种不兼容性?这些变化属于什么类别?在哪里可以找到有关此类更改及其发生原因的更详细信息?
我是否被迫使用旧版本,因为这些库是使用旧版本构建的?没有办法使用较新的版本吗? 通常如何处理这些情况?