1

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_initsema_initみましたが、コンパイルされました(オンラインのどこかで見ました)。ただし、これは、コード全体を調べて、sem を sema に置き換える必要があることを意味します。もっと簡単な解決策はありませんか?そして、それは本当にどういう意味ですか?

4

2 に答える 2

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);
于 2011-11-07T11:33:53.420 に答える
2

このすべての前に、まず、正しくリンクしていることを確認します。うまくコンパイルされたように見えますが、リンクの段階で失敗しました。したがって、最初に実際に持っsemaphore.hていることと、含まれていることを確認してくださいsem_init(...)。もしそうなら、そして私の推測ではそうです、あなたのコンパイルコマンドをチェックしてください。それが質問のコンパイル コマンドである場合は、-lpthreadコンパイル行に追加して、posix スレッド ライブラリにリンクしてみてください。


これらは異なるライブラリであるため、sema が意図したとおりに機能することを再確認する必要があります。これsemは POSIXpthreadsライブラリsemaからのものであり、solaristhreadライブラリからのものです。(こちらも参照してください) しかし、コードに互換性があり、クロスプラットフォーム互換のコードを探している場合は、単純なラッパー関数を作成し、条件付きで含めるなどの操作を実行する必要があります。

ラッパー関数は非常に単純で、同じ型を受け入れて同じ型を返します。

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

そして、条件付きで次のようなものを含めます

#ifdef SOLARIS
#include semaphore_wrappers.h
#endif

SOLARIS は定義されないことに注意してください。solaris でコンパイルするときに手動で行うか#define SOLARIS、コンパイル コマンド ライン / makefile で定義する必要があります。

少なくとも私はそうします。

これがクロスプラットフォーム互換でない場合は、グローバル検索と置換を行うだけで、読み取りとデバッグがはるかに簡単になることに注意してください。

于 2011-11-07T11:16:33.257 に答える