我已经编写了一些在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。有没有更简单的解决方案?它究竟意味着什么?
答案 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中定义它。
至少我就是这样做的。
请注意,如果 是跨平台兼容的,那么如果您只是进行全局搜索和替换,则更容易阅读和调试。