newlib-nano长整型支持

3

我正在使用GCC交叉编译器(arm-none-eabi-)开发针对ARM架构(裸机)的程序。为了保持代码大小小,我使用"--specs = nano.specs"链接标志来链接newlib-nano。我遇到的问题是在printf中支持“long long”,即:

long long int val = 1234;
pritnf("%lld", val);

添加"-u _printf_float"链接器标志并不能解决这个问题。它确实会使代码大小增加9kB,但似乎只是添加了对浮点数的支持,而没有添加对"long long"的支持。与newlib链接(删除"--specs=nano.specs"标志)虽然可以解决问题,但不可接受,因为它会导致代码大小增加46kB。
是否有任何标志可以重新启用newlib-nano版本的printf的"long long"支持?

考虑以十六进制打印它,这可以通过将其分成两个 uint32_t 并打印它们来完成。 - unwind
这对于打印“-1234LL”并不是很有帮助。 - Jonathan Wakely
1个回答

2

不太清楚newlib-nano(是否是某个分支?),但是newlib也没有默认支持long long格式说明符,因此这可能有所帮助:

  • 使用--enable-newlib-io-long-long标志重新配置newlib
  • 重新构建

1
newlib-nano是newlib的简化版本。根据此链接:linkenable-newlib-io-long-long标志被忽略。这似乎回答了我的问题 - 要么使用newlib,要么在使用newlib-nano的情况下将无法支持long long - J_S
@JacekŚlimok:或者你可以将long long支持从newlib移植到newlib-nano。 - Keith Thompson
@KeithThompson 我会研究一下这个问题,看看移植这个单独的部分需要多少工作量。不过我假设 enable-newlib-io-long-long 被明确忽略是有原因的。 - J_S
1
是的,8年后 - 我也遇到了由芯片供应商提供的库的问题(即:microsemi和xilinx)- 建议我可以重新配置newlib... 是的,如果我正在开发自己的交叉工具链,我可以这样做,并且在以前的生活中我确实这样做了。 明确看到“无浮点数”的优点(浮点数占用很大空间),但uint64_t不是.. - user3696153

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接