Перед всем этим я бы сначала удостоверился, что вы правильно ссылаетесь. Вроде скомпилировано нормально, но не удалось на этапе компоновки. Поэтому сначала убедитесь, что у вас есть 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.
По крайней мере, так я бы это сделал.
Обратите внимание, что если это , а не для кросс-платформенной совместимости, то намного проще читать и отлаживать, если вы просто выполните глобальный поиск и замену.