2011-09-14 4 views
3

説明するのが少し難しいかもしれない問題に直面していて、全体像を与えることが大きすぎると難しいです。pthreadライブラリの問題をリンクする

よろしくお願いいたします。

次のMakefileを考えてみましょう:

all: clients.so simulator backup 
    LD_PRELOAD=/home/Juggler/client/clients.so ./simulator 

backup: backup.c libclient.a 
    gcc backup.c -o backup -L /home/Juggler/client -L. -lclient -ldl 
simulator: simulator.c libclient.a 
    gcc -g simulator.c -o simulator -L /home/Juggler/client -L. -lclient -ldl -pthread 
libclient.a: libclient.o client.o 
    ar rcs libclient.a libclient.o client.o 
libclient.o:libclient.c 
    gcc -c libclient.c -o libclient.o -pthread 

clients.so: client.o client_invoke.o 
    ld -shared -o clients.so client_invoke.o client.o -ldl 
client_invoke.o: client_invoke.c 
    gcc -Wall -fPIC -DPIC -c -g client_invoke.c 
client.o: client.c 
    gcc -Wall -fPIC -DPIC -c -g client.c -ldl -pthread 

我々は(pthread_key_createのための呼び出しを行ういるclient.cにlibclient.cからいるclient.cで書かれた機能と、これらの関数を呼び出す)、pthread_setspecific..etc。

スレッドはsimulator.cによって作成され、スレッドは他のファイルに書き込まれた関数にアクセスします。

実行時に...次のようなエラーが表示されます。

/home/Juggler/client/libclient.a(client.o):In function 'setup_connection': 
/home/Juggler/client/client.c:35: undefined reference to 'pthread_setspecific' 

pthread.hのは、両方いるclient.cに含まれていると

libclient.c anypointersに感謝されるだろう。私は...情報は非常に少ない

おかげで、Linux上で

答えて

9

を理解し、pthreadの機能は、libpthreadのライブラリに住んでいます。だからあなたはそれにリンクしなければならない。

pthreadを使用する場合、適切な方法は、-pthreadを使用してコンパイルしてリンクすることです。これはとりわけpthreadライブラリでリンクされます。いくつかの実行可能ファイルには-pthreadフラグがありますが、他のものではなく、clients.soライブラリではないので、必要に応じてフラグを追加してください。

また、共有ライブラリを作成するときは、ソースファイルを-fPICフラグを付けてコンパイルする必要があります。

+0

おかげで...私はバックアップをコンパイルする-pthreadフラグを追加するために必要な(そして、あなたは、あなたが本当にリンクを行うためにはgccを使用する必要があります。ldが直接client.soライブラリーを作製するために呼び出しているようです)。 c –

関連する問題