对于undefined reference stderr问题的解决

最近在尝试移植某个别人编译好的静态库,在移植过程中出现了未定义的stderr的错误,因此就对以上问题进行了一些简单的研究。

首先来观察以下<stdio.h>中如何对stderr定义,定义如下:

/* Standard streams.  */
extern struct _IO_FILE *stdin;		/* Standard input stream.  */
extern struct _IO_FILE *stdout;		/* Standard output stream.  */
extern struct _IO_FILE *stderr;		/* Standard error output stream.  */
/* C89/C99 say they're macros.  Make them happy.  */
#define stdin stdin
#define stdout stdout
#define stderr stderr

通过以上定义可以得知stderr在预处理阶段会被替换为stderr,这一步显然没有什么作用,但此时stderr是在其他文件中定义的struct _IO_FILE *类型的指针,因此stderr也是一个全局符号。

但移植的环境坏就坏在stderr一上来就换成了别的东西,因此根本就没有stderr这个全局符号,也就造成了未定义stderr错误的问题。

对于以上问题解决方式也很简单,首先解除替换stderr

#undef stderr

再定义一个全局符号,并将stderr指向原stderr指向的内容。

把我参考的网站也发给大家。

http://lists.uclibc.org/pipermail/uclibc/2001-July/022610.html

最后和大家说一句,不是一个编译器编译的还真链接不到一块去。

你可能感兴趣的:(gcc,移植,库)