我正在处理跨编译到多个目标体系结构的代码。
我查看了搜索"printf size_t unknown conversion type character"警告的Stack Overflow中少数 帖子, 但这些帖子似乎都与
如果粗体问题的直接答案是“否”,那么还有哪些可能的解决方案?我能想到的可能性是...
我认为(但不确定)跨编译器版本已经过时了;已知/保证新版本的工具链是否具有将“
更新:这个交叉编译器似乎无法识别“-std=c99”,将其添加到编译器标志中会生成错误“cc1:未知的C标准'c99'”。
我查看了搜索"printf size_t unknown conversion type character"警告的Stack Overflow中少数 帖子, 但这些帖子似乎都与
minGW
有关,因此那些答案本质上是针对_WIN32
进行ifdef
,不适用于我的实例,即printf
无法将"%zu
"识别为size_t
的格式说明符,但是使用mips
交叉编译器。
是否存在现有的编译器标志(针对指定的交叉编译器),使得libc能够将"%zu"识别为size_t
的格式说明符?
$ cat ./main.c
// main.c
#include <stdio.h>
int main( int argc, char* argv[] )
{
size_t i = 42;
printf( "%zu\n", i );
return 0;
}
$ /path/to/mips_fp_le-gcc --version
2.95.3
$
$ file /path/to/libc.so.6
/path/to/libc.so.6: ELF 32-bit LSB pie executable, MIPS, MIPS-I version 1 (SYSV), dynamically linked, interpreter /lib/ld.so.1, for GNU/Linux 2.2.15, not stripped, too many notes (256)
$
$ /path/to/mips_fp_le-gcc -mips2 -O2 -EL -DEL -pipe -Wall -Wa,-non_shared -DCPU=SPARC -DLINUX -D_REENTRANT -DPROCESS_AUID -DTAGGING -fPIC -I. -I../../../root/include -I../include -I../../../common/include -I../../..
/root/include -DDISABLE_CSL_BITE -DDISABLE_DNS_LOOKUP -DOS=UNIX -DLINUX -DPOSIX_THREADS -D__USE_GNU -D_FORTIFY_SOURCE=2 -DHANDLE_CSL_DUPLICATES -DOS=UNIX -DLINUX -DPOSIX_THREADS -D__USE_GNU -D_FORTIFY_SOURCE=2 -DHANDLE_CSL_DUPLICATES -DOS=UNIX -DLINUX -DPOSIX_THREADS -D__USE_GNU -D_FORTIFY_SOURCE=2 -DHANDLE_C
SL_DUPLICATES -DOS=UNIX -DLINUX -DPOSIX_THREADS -D__USE_GNU -D_FORTIFY_SOURCE=2 -DHANDLE_CSL_DUPLICATES -o ./main.o -c main.c
main.c: In function `main':
main.c:6: warning: unknown conversion type character `z' in format
main.c:6: warning: too many arguments for format
如果粗体问题的直接答案是“否”,那么还有哪些可能的解决方案?我能想到的可能性是...
register_printf_function()
- 在特定于目标的宏中包装格式说明符(类似于this
minGW
-specific post)
我认为(但不确定)跨编译器版本已经过时了;已知/保证新版本的工具链是否具有将“
%zu
”识别为size_t
的格式说明符的libc
?
更新:这个交叉编译器似乎无法识别“-std=c99”,将其添加到编译器标志中会生成错误“cc1:未知的C标准'c99'”。
inttypes.h
中用于stdint.h
类型的风格:#define PRIuz "lu"
(或者你需要使用的任何其他内容替代"zu"
),然后使用printf("%" PRIuz "\n", i);
。当然,这需要更改代码,我相信你正在尝试避免这种情况 :( - ikegami-fstd=c9x
或-fstd=gnu9x
。 - Shawn