在Solaris下无法使用信号量编译代码?

时间:2011-11-07 11:06:14

标签: c solaris linker-errors semaphore build-error

我已经编写了一些在linux下编译好的代码但在Solaris上我得到了一些编译错误。我使用gcc test_compile.c -o tes -pthreads进行编译。

#include <semaphore.h>

int main(){
    sem_t semaphore;
    sem_init(&semaphore, 0, 0);
    return 0;
}

给我

itchy:~/edu/sysprog> gcc test_compile.c -o tes -pthreads
Undefined                       first referenced
 symbol                             in file
sem_init                            /var/tmp//ccUiSK6A.o
ld: fatal: Symbol referencing errors. No output written to tes

我不确定发生了什么。我尝试用sem_init替换sema_init并编译(在某处在线查看)。但是这意味着我必须完成整个代码并用sema替换sem。有没有更简单的解决方案?它究竟意味着什么?

2 个答案:

答案 0 :(得分:3)

您需要链接实时扩展程序库librt

gcc test_compile.c -o tes -lrt -pthreads

sem_init(3RT)的手册页中记录了这一点:

SYNOPSIS
     cc [ flag... ] file... -lrt [ library... ]
     #include <semaphore.h>

     int sem_init(sem_t *sem, int pshared, unsigned int value);

答案 1 :(得分:2)

在此之前,我首先要确保你正确连接。它似乎编译得很好,但在链接步骤失败了。首先请确保您确实拥有semaphore.h并且其中包含sem_init(...)。如果你这样做,我的猜测是你做的,检查你的编译命令。如果这是您的问题中的编译命令,请尝试将-lpthread添加到编译行以链接到posix线程库中。


因此,您应该仔细检查sema是否符合您的要求,因为它们是不同的库 - sem来自POSIX pthreads库,sema来自solaris {{ 1}}库。 (See this also)但是如果它们是代码兼容的,并且如果你正在寻找跨平台兼容的代码,你可能想要做一些事情,比如创建简单的包装函数然后有条件地包含它。

你的包装函数非常简单,接受相同的类型并返回相同的类型,例如

thread

然后有条件地将其包含在

之类的内容中
ret_type sem_init(argtype arg1, argtype arg2, argtype arg3)
{
    return sema_init(arg1, arg2, arg3)
}

请注意,不会定义SOLARIS。在solaris上编译时,您必须手动#ifdef SOLARIS #include semaphore_wrappers.h #endif ,或者在编译命令行/ makefile中定义它。

至少我就是这样做的。

请注意,如果 是跨平台兼容的,那么如果您只是进行全局搜索和替换,则更容易阅读和调试。