Не можете скомпилировать код с семафором под Solaris? - PullRequest
1 голос
/ 07 ноября 2011

Я написал некоторый код, который прекрасно компилируется под 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, и он компилируется (видел, что где-то в Интернете). Однако это будет означать, что я должен пройти весь мой код и заменить sem на sema. Разве нет более простого решения? И что это на самом деле означает?

Ответы [ 2 ]

3 голосов
/ 07 ноября 2011

Вам нужно связаться с библиотекой расширений реального времени 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);
2 голосов
/ 07 ноября 2011

Перед всем этим я бы сначала удостоверился, что вы правильно ссылаетесь. Вроде скомпилировано нормально, но не удалось на этапе компоновки. Поэтому сначала убедитесь, что у вас есть semaphore.h и что он включает sem_init(...). Если вы это сделаете, и я думаю, что вы делаете, проверьте вашу команду компиляции. Если это ваша команда компиляции в вашем вопросе, попробуйте добавить -lpthread в строку компиляции для ссылки в библиотеке потоков posix.


Таким образом, вам следует дважды проверить, что sema выполняет то, что вам нужно, поскольку они являются разными библиотеками - sem из библиотеки POSIX pthreads, а sema из библиотеки thread solaris. ( См. Также ) Но если они совместимы по коду и если вы ищете кросс-платформенный код, вам, вероятно, захочется сделать что-то вроде создания простых функций-оболочек, а затем условно включить их .

Ваши функции-обертки были бы очень простыми, принимали бы те же типы и возвращали бы тот же тип, например

ret_type sem_init(argtype arg1, argtype arg2, argtype arg3)
{
    return sema_init(arg1, arg2, arg3)
}

А затем условно включить его с чем-то вроде

#ifdef SOLARIS
#include semaphore_wrappers.h
#endif

Обратите внимание, что SOLARIS не будет определен. Вам придется либо вручную #define SOLARIS при компиляции на Solaris, либо определить это в командной строке компиляции / makefile.

По крайней мере, так я бы это сделал.

Обратите внимание, что если это , а не для кросс-платформенной совместимости, то намного проще читать и отлаживать, если вы просто выполните глобальный поиск и замену.

...