在SunOS(C编程)上编译时,strerror\u r会导致错误

在SunOS(C编程)上编译时,strerror\u r会导致错误,c,string,linker-errors,C,String,Linker Errors,我有一个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 s

我有一个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

有什么想法吗?

听起来您需要给链接器一个额外的提示来指定库,它可能不像Linux那样位于标准路径中,如果您知道库的名称,那么在SunOS下调用gcc或等效工具时,显式指定库路径作为CLI编译器的一部分

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

LIBS = -L/usr/lib -L/usr/sys/lib -lsome_lib1 -lsome_lib2 LIBS=-L/usr/lib-L/usr/sys/lib-lsome_lib1-lsome_lib2 这里有一行用于调用makefile中的编译器——请注意对LIBS变量的引用,如我在上面所示

$(CC) -o $@ $(FILES) $(LIBS) $(CFLAGS) $(CC)-o$@$(文件)$(LIBS)$(CFLAGS) 希望这有帮助, 顺致敬意,
Tom。

听起来您需要给链接器一个额外的提示来指定库,它可能不像Linux那样位于标准路径中,如果您知道库的名称,在SunOS下调用gcc或等效程序时,请在CLI编译器中显式指定库路径

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

LIBS = -L/usr/lib -L/usr/sys/lib -lsome_lib1 -lsome_lib2 LIBS=-L/usr/lib-L/usr/sys/lib-lsome_lib1-lsome_lib2 这里有一行用于调用makefile中的编译器——请注意对LIBS变量的引用,如我在上面所示

$(CC) -o $@ $(FILES) $(LIBS) $(CFLAGS) $(CC)-o$@$(文件)$(LIBS)$(CFLAGS) 希望这有帮助, 顺致敬意,
Tom.

看起来strerror\r可能无法在该平台上使用。我刚刚检查了一个旧的Solaris 2.8框,strerror\u r不可用


由于缺乏线程安全性,您可能不得不使用strerror并处理偶尔出现的错误结果。

strerror在该平台上可能不可用。我刚刚检查了一个旧的Solaris 2.8框,strerror\u r不可用

看起来您将不得不使用strerror并处理由于缺乏线程安全性而偶尔出现的错误结果。

该“隐式声明”警告告诉您,您拥有的
\include
d头中没有一个定义了该函数和“未定义的符号”警告告诉您,函数本身未在您链接的任何库中定义

综上所述,这意味着您正在编译的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;
}
“隐式声明”警告告诉您,您拥有的
#include
d头中没有一个定义了该函数,“未定义符号”警告告诉您,该函数本身未在您链接的任何库中定义

综上所述,这意味着您正在编译的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;
}

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

伊利诺斯芝加哥大学的伯恩斯坦博士可能会发现以下关于POSIX兼容性的文章:

祝你好运


-bn

LinuxSunOS是不同的操作系统,可能有不同的功能实现

伊利诺斯芝加哥大学的伯恩斯坦博士可能会发现以下关于POSIX兼容性的文章:

祝你好运


-哇,太可怕了。我不知道如何处理多线程程序中缺乏线程安全性的函数。错误。。或者您可以使用锁定来控制对
strerror
函数的访问,而不必处理错误的结果?哇,这太可怕了。我不知道如何处理多线程程序中缺乏线程安全性的函数。错误。。或者您可以使用锁定来控制对
strerror
函数的访问,而不必处理不正确的结果?有人对如何“自己滚动”有什么建议吗?谷歌搜索“solaris strerror线程安全”似乎表明strerror()在solaris上是线程安全的,但我没有找到“官方”的答案在这种情况下,您可以删除上述函数中的pthreads锁,然后就可以开始了。或者,如果在solarisWell上编译,可以使用一个预处理器命令来删除锁,这些锁无论如何都不太可能受到激烈的争用-希望您不会在
strerror
上遇到瓶颈!有人对如何“自己滚”有什么建议吗?谷歌搜索“solaris strerror线程安全”似乎表明strerror()在solaris上是线程安全的,但我没有找到这样的“官方”声明。在这种情况下,您可以在上面的函数中删除pthreads锁,这样就可以了。或者,如果在solarisWell上编译,可以使用一个预处理器命令来删除锁,那么这些锁不太可能是高度竞争的-希望您不会在
strerror
上遇到瓶颈!