- ベストアンサー
Fedora7でlibpthread.aをリンクするとコンパイルエラーになる
- Fedora7でマルチスレッドのプログラムをビルドし、libpthread.aをリンクしたところ、コンパイルエラーになってしまいました。libpthread.aのバージョン変更により、問題が発生した可能性があります。
- glibc-develをダウングレードしようと試みましたが、glibc-commonの依存関係が厳しく、成功しませんでした。ビルド中にlibpthread.a内で使用されている関数がundefinedであるため、エラーが発生しました。
- 解決策についてはインターネットで検索したが見つからず、どう助けを受けるべきか分からない状況です。Fedora7でlibpthread.aをリンクし、undefinedのエラーを回避して正常にビルドする方法を教えてください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
自分ならどうするかというと, 1.まず g++ にオプション (-v?) を付けて, 「中でどんな処理をしているのか」を全部表示させる. これで, 「リンクされるはず」のライブラリを見付ける. 2.undefined reference になっているシンボルをどのライブラリが提供しているか, がんばって調べる. nm などを使うかな. 3.(必要なら) 2で見付けたライブラリをリンクする. ところで, libpthread を 2回リンクしてるような気がするんだけど....
その他の回答 (1)
- shirayukix
- ベストアンサー率43% (90/207)
解決できるか分かりませんが、 エラーを起こす、最小限のソースを示してください。
補足
返答ありがとうございます。 自分の書いていたソースですが、 まずまず大きくなっていまして抽出がしづらかったため、 ネットより最小のサンプルを探して参りました。 www.geocities.jp/woodwood77777/linux_c_pthread01.htm#pthread01 こちらもビルドをしますと、同様のエラーが起こりました。 何卒宜しくお願い致します。 #include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <unistd.h> #include <sys/types.h> void *thread_func(void *param) { int pid; pthread_t thread_id; thread_id = pthread_self(); fprintf(stderr , "thread_func called\n"); fprintf(stderr , " thread ID = %ld\n" , thread_id); pid = getpid(); fprintf(stderr , " 2:pid=%d\n" , pid); } int main(int argc, char *argv[]) { pthread_t thread; int pid; fprintf(stderr , "---Program start---\n"); pid = getpid(); fprintf(stderr , "1:pid = %d\n" , pid); if(pthread_create(&thread , NULL , thread_func , NULL) !=0) perror("pthread_create()"); fprintf(stderr , "Next line of pthread_create() called. thread ID=%ld\n" , thread); pthread_join(thread , NULL); return EXIT_SUCCESS; } [root@localhost ~]# g++ -o test main.cpp /usr/lib/libpthread.a -lpthread /usr/lib/libpthread.a(pthread_create.o): In function `pthread_create': (.text+0xca3): undefined reference to `_dl_stack_flags' /usr/lib/libpthread.a(pthread_create.o): In function `pthread_create': (.text+0x1126): undefined reference to `_dl_stack_flags' /usr/lib/libpthread.a(ptw-pause.o): In function `__pause_nocancel': (.text+0x18): undefined reference to `__syscall_error' /usr/lib/libpthread.a(ptw-pause.o): In function `__pause_nocancel': (.text+0x3b): undefined reference to `__syscall_error' /usr/lib/libpthread.a(init.o): In function `__pthread_initialize_minimal': (.text+0x16c): undefined reference to `__libc_setup_tls' /usr/lib/libpthread.a(init.o): In function `__pthread_initialize_minimal': (.text+0x328): undefined reference to `_dl_init_static_tls' /usr/lib/libpthread.a(init.o): In function `__pthread_initialize_minimal': (.text+0x34d): undefined reference to `_dl_wait_lookup_done' /usr/lib/libpthread.a(ptw-read.o): In function `__read_nocancel': (.text+0x26): undefined reference to `__syscall_error' /usr/lib/libpthread.a(ptw-read.o): In function `__read_nocancel': (.text+0x56): undefined reference to `__syscall_error' /usr/lib/libpthread.a(ptw-open.o): In function `__open_nocancel': (.text+0x26): undefined reference to `__syscall_error' /usr/lib/libpthread.a(ptw-open.o): In function `__open_nocancel': (.text+0x56): undefined reference to `__syscall_error' /usr/lib/libpthread.a(sigaction.o): In function `__libc_sigaction': (.text+0x60): undefined reference to `_dl_sysinfo_dso' /usr/lib/libpthread.a(sigaction.o): In function `sigaction': (.text+0x19a): undefined reference to `_dl_sysinfo_dso' collect2: ld はステータス 1 で終了しました
補足
>ところで, libpthread を 2回リンクしてるような気がするんだけど.... 返答ありがとうございます。 ライブラリのパスを指定しようとして、ビルド間違えてました。 g++ -v -o test main.cpp /usr/lib/libpthread.a -lpthread ↓ g++ -v -o test main.cpp -L/usr/lib -lpthread こちらに直したら、ビルド通りました。 お騒がせしましてすみません。 ありがとうございました。