2009-12-13 76 views
0

我有编译和Linux下运行良好,没有任何警告的一个C程序,但是,试图编译它在SunOS的时候,我得到以下警告:strerror_r导致错误时编译在SunOS(C编程)

test.c: In function `my_function': 
test.c:412: warning: implicit declaration of function `strerror_r' 
Undefined      first referenced 
symbol        in file 
strerror_r       /var/tmp/ccRiPoGl.o 
ld: fatal: Symbol referencing errors. No output written to test 
collect2: ld returned 1 exit status 
make: *** [test] Error 1 

任何想法?

回答

2

“隐式声明”警告告诉您,您没有任何头文件定义该函数,并且“未定义符号”警告告诉您函数本身未在任何库中定义你正在链接。

综合起来,这意味着你正在编译的C库不提供strerror_r函数。你将不得不推出自己的选择。

例如,如果你使用pthreads,你可以这样做:

int my_strerror_r(int errnum, char *buf, size_t buflen) 
{ 
    static pthread_mutex_t strerror_lock = PTHREAD_MUTEX_INITIALIZER; 

    if (!buflen) 
    { 
     errno = ENOSPC; 
     return -1; 
    } 

    buf[0] = 0; 

    pthread_mutex_lock(&strerror_lock); 
    strncat(buf, strerror(errnum), buflen - 1); 
    pthread_mutex_unlock(&strerror_lock); 

    return 0; 
} 
+0

任何人对如何“自己滚动?”有任何建议? – Jenna 2009-12-13 02:20:19

+0

查看我更新的答案,了解其中的一种方法。 – caf 2009-12-13 02:36:55

+0

谷歌搜索“solaris strerror线程安全”似乎表明strerror()在Solaris上是线程安全的,但我没有提出这样的“官方”声明。 – 2009-12-13 03:02:12

0

听起来就像你需要额外提示链接器指定库,它可能不像Linux一样处于标准路径中,如果知道库的名称,请明确指定库路径作为在SunOS下调用gcc或同等版本时的CLI编译器的一部分。

下面是在makefile中使用LIBS变量的示例。

 
LIBS = -L/usr/lib -L/usr/sys/lib -lsome_lib1 -lsome_lib2 

下面是用于调用编译器在生成文件的线 - 注意到参考LIBS变量如我在上面已经示出。

 
$(CC) -o [email protected] $(FILES) $(LIBS) $(CFLAGS) 

希望这有助于 最好的问候, 汤姆。

1

它看起来像strerror_r可能无法在该平台上使用。我刚刚检查了一个旧的Solaris 2.8盒子,而strerror_r不可用。

它看起来像你必须使用strerror,并处理由于缺乏线程安全性偶尔不正确的结果。

+0

哇,这是害怕。我不知道如何处理在多线程程序中缺乏线程安全性的函数。 – Jenna 2009-12-13 02:18:37

+0

Err ..或者你可以使用锁来控制对'strerror'函数的访问,*不*必须处理不正确的结果? – caf 2009-12-13 02:19:08

0

的Linux的SunOS是不同的操作系统,可能有你正在使用的功能的不同实现。

您可能会发现在芝加哥大学的POSIX兼容下面的文章伯恩斯坦博士在伊利诺伊帮助:

http://cr.yp.to/docs/unixport.html

祝你好运,

-bn