我运行MUD(用C编码),并将其迁移到新服务器上。我在两个(和相同的Makefile)上都运行了相同版本的gcc,但是在编译时在新服务器上却出现错误:
/usr/bin/gcc34 -c -g -g3 -Wall -DREQUESTS -DSMAUG14 -DTIMEFORMAT -DREGEX build.c
build.c:33: error: conflicting types for 'strtold'
/usr/include/stdlib.h:178: error: previous declaration of 'strtold' was here
该行:
long double strtold args( ( const char *string, const char **endstring) );
新服务器上的stdlib.h行:
extern long double strtold (__const char *__restrict __nptr,
char **__restrict __endptr)
在stdlib.h上,旧服务器上同一目录中的同一行:
extern long double strtold (__const char *__restrict __nptr,
char **__restrict __endptr)
但是旧服务器没有收到此编译错误。旧服务器gcc:
[user@old src]# /usr/bin/gcc34 -v
Reading specs from /usr/lib/gcc/i386-redhat-linux/3.4.6/specs
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --disable-checking --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-languages=c,c++,f77 --disable-libgcj --host=i386-redhat-linux
Thread model: posix
gcc version 3.4.6 20060404 (Red Hat 3.4.6-4.1)
新服务器gcc:
[user@new src]$ /usr/bin/gcc34 -v
Reading specs from /usr/lib/gcc/x86_64-redhat-linux/3.4.6/specs
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --disable-checking --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-languages=c,c++,f77 --disable-libgcj --host=x86_64-redhat-linux
Thread model: posix
gcc version 3.4.6 20060404 (Red Hat 3.4.6-19.el6)
请注意,args
是:
#define args( list ) ( )
我在这里想念什么?如果代码,gcc版本和Makefile相同,那可能指向另一个库?
更新:运行gcc -E
开始揭示一些旧服务器:
3946. extern long double __strtold_internal (__const char *__restrict __nptr,
3947. char **__restrict __endptr,
3948. int __group)
3949. __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1))) ;
新服务器:
4525. extern long double strtold (__const char *__restrict __nptr,
4526. char **__restrict __endptr)
4527. __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1))) ;
显然stdlib.h不同。即使我具有相同的gcc版本,是否有任何方法可以在新服务器上复制旧库以确保此迁移顺利进行?
我还注意到库中strtold
extern上方的这一点:
#ifdef __USE_ISOC99
__BEGIN_NAMESPACE_C99
相关吗? http://www-01.ibm.com/support/docview.wss?uid=swg21455370
答案 0 :(得分:3)
您的签名不匹配。您的定义具有const char *, const char **
,但stdlib.h具有const char *, char **
。请注意,它们的第二个参数不是恒定的。解决该问题,它可能会起作用。
为什么在我不能说之前没有出错。您正在13年的操作系统上使用12年的编译器。
如果对于您自己的strtold
实现,大概是这样,以防不存在。通常,您要运行一个配置程序,该程序会探测系统的功能并生成带有诸如#define HAS_STRTOLD
之类的定义的头文件。然后,您可以使用#ifndef HAS_STRTOLD
包装兼容版本。
您的代码可能确实有类似这样的内容。在旧计算机上找到strtold
,而在新计算机上找不到。探针可能在新机器上坏了。