0

我有一个 C 程序,它在 Linux 下编译和运行良好,没有任何警告,但是当试图在 SunOS 上编译它时,我收到以下警告:

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

有任何想法吗?

4

4 回答 4

2

“隐式声明”警告告诉您,您所拥有的任何标头都#include没有定义该函数,而“未定义符号”警告告诉您该函数本身未在您链接的任何库中定义在。

总之,这意味着您正在编译的 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;
}
于 2009-12-13T02:18:14.660 回答
1

看起来 strerror_r 在该平台上可能不可用。我刚刚检查了一个旧的 Solaris 2.8 机器并且 strerror_r 不可用。

由于缺乏线程安全性,您似乎必须使用 strerror 并处理偶尔出现的错误结果。

于 2009-12-13T02:14:31.117 回答
0

听起来您需要向链接器提供额外提示以指定库,它可能不像 Linux 那样位于标准路径中,如果您知道库的名称,请明确指定库路径作为在 SunOS 下调用 gcc 或等效项时的 CLI 编译器。

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

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

这是用于在 makefile 中调用编译器的一行 - 请注意对 LIBS 变量的引用,如上所示。

$(CC) -o $@ $(FILES) $(LIBS) $(CFLAGS)

希望这会有所帮助,最好的问候,汤姆。

于 2009-12-13T02:08:14.450 回答
0

LinuxSunOS是不同的操作系统,可能对您正在使用的功能有不同的实现。

您可能会发现以下伊利诺伊州芝加哥大学 Bernstein 博士关于 POSIX 兼容性的文章很有帮助:

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

祝你好运,

-bn

于 2009-12-13T02:21:12.767 回答