8

全体像を示すことは大きすぎて難しいため、説明と理解が少し複雑になる可能性のある問題に直面しています。

すみません。

次の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

libclient.cからclient.cで記述された関数を呼び出し、client.cのこれらの関数はpthread_key_create()、pthread_setspecific..etcを呼び出します。

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

makeを実行すると...次のようなエラーが表示されます。

/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に感謝します。私は情報が非常に少ないことを理解しています...

ありがとう

4

1 に答える 1

15

Linuxでは、pthread関数はlibpthreadライブラリにあります。だからあなたはそれにリンクする必要があります。

-pthreadpthreadを使用する場合の適切な方法は、特にpthreadライブラリでリンクするを使用してコンパイルおよびリンクすることです。一部の実行可能ファイルには-pthreadフラグがありますが、他の実行可能ファイルにはフラグがなく、clients.soライブラリにもフラグがないため、必要に応じてフラグを追加します。

また、共有ライブラリを作成するときは、-fPICフラグを使用してソースファイルをコンパイルする必要があることを忘れないでください。

ld(そして、 client.soライブラリを生成するために直接呼び出しているようですが、実際にはgccを使用してリンクを行う必要があります。)

于 2011-09-14T16:00:51.490 に答える