libpthread.so.0:シンボルの追加エラー:コマンドラインにDSOがありません


205

openvswitch-1.5.0をコンパイルしているときに、次のコンパイルエラーが発生しました。

 gcc -Wstrict-prototypes -Wall -Wno-sign-compare -Wpointer-arith
     -Wdeclaration-after-statement -Wformat-security -Wswitch-enum -Wunused-parameter -Wstrict-aliasing -Wbad-function-cast -Wcast-align -Wstrict-prototypes -Wold-style-definition -Wmissing-prototypes -Wmissing-field-initializers -Wno-override-init  -g -O2 -export-dynamic ***-lpthread***  -o utilities/ovs-dpctl utilities/ovs-dpctl.o lib/libopenvswitch.a
 /home/jyyoo/src/dpdk/build/lib/librte_eal.a
 /home/jyyoo/src/dpdk/build/lib/libethdev.a
 /home/jyyoo/src/dpdk/build/lib/librte_cmdline.a
 /home/jyyoo/src/dpdk/build/lib/librte_hash.a
 /home/jyyoo/src/dpdk/build/lib/librte_lpm.a
 /home/jyyoo/src/dpdk/build/lib/librte_mbuf.a
 /home/jyyoo/src/dpdk/build/lib/librte_ring.a
 /home/jyyoo/src/dpdk/build/lib/librte_mempool.a
 /home/jyyoo/src/dpdk/build/lib/librte_malloc.a -lrt -lm 
     /usr/bin/ld: /home/jyyoo/src/dpdk/build/lib/librte_eal.a(eal.o): undefined reference
     to symbol 'pthread_create@@GLIBC_2.2.5'
     /lib/x86_64-linux-gnu/libpthread.so.0: error adding symbols: DSO missing from 
     command line

の記号を表示しようとするとlibpthread、問題ありません。

$ readelf -s /lib/x86_64-linux-gnu/libpthread.so.0 | grep pthread_create
   199: 0000000000008220  2814 FUNC    GLOBAL DEFAULT   13 pthread_create@@GLIBC_2.2.5
   173: 0000000000008220  2814 FUNC    LOCAL  DEFAULT   13 __pthread_create_2_1
   462: 0000000000008220  2814 FUNC    GLOBAL DEFAULT   13 pthread_create@@GLIBC_2.2

ヒントやアドバイスはありますか?



link_libraries(pthread)
Alex Punnen

#readelf -s /lib/x86_64-linux-gnu/libncurses.so readelf:エラー: '/lib/x86_64-linux-gnu/libncurses.so'が見つかりませんでした。システムエラーメッセージ:シンボリックリンクのレベルが多すぎます
Ashish Karpe 2017年


4
Goddamnit、私はしgccませんでしたg++
ポストセルフ

回答:


164

オブジェクトファイルをコンパイルした、コマンドラインでライブラリに言及する必要があります。

 gcc -Wstrict-prototypes -Wall -Wno-sign-compare -Wpointer-arith -Wdeclaration-after-statement -Wformat-security -Wswitch-enum -Wunused-parameter -Wstrict-aliasing -Wbad-function-cast -Wcast-align -Wstrict-prototypes -Wold-style-definition -Wmissing-prototypes -Wmissing-field-initializers -Wno-override-init \
     -g -O2 -export-dynamic -o utilities/ovs-dpctl utilities/ovs-dpctl.o \
     lib/libopenvswitch.a \
     /home/jyyoo/src/dpdk/build/lib/librte_eal.a /home/jyyoo/src/dpdk/build/lib/libethdev.a /home/jyyoo/src/dpdk/build/lib/librte_cmdline.a /home/jyyoo/src/dpdk/build/lib/librte_hash.a /home/jyyoo/src/dpdk/build/lib/librte_lpm.a /home/jyyoo/src/dpdk/build/lib/librte_mbuf.a /home/jyyoo/src/dpdk/build/lib/librte_ring.a /home/jyyoo/src/dpdk/build/lib/librte_mempool.a /home/jyyoo/src/dpdk/build/lib/librte_malloc.a \
     -lrt -lm -lpthread 

説明:リンクはモジュールの順序に依存しています。シンボルは最初に要求され、次にそれらを含むライブラリからリンクされます。したがって、最初にライブラリを使用するモジュールを指定し、その後にライブラリを指定する必要があります。このような:

gcc x.o y.o z.o -la -lb -lc

さらに、循環依存がある場合は、コマンドラインで同じライブラリを複数回指定する必要があります。だから、場合にlibbからシンボルを必要とlibcしてlibcからシンボルを必要とするlibbコマンドライン、次のようになります。

gcc x.o y.o z.o -la -lb -lc -lb

24
あなたは-Wl,--start-group -la -lb- -lc -Wl,--end-group循環依存関係のためにあなたができると思います。
Zボソン

2
これはソースファイルにも当てはまります。ライブラリの前にリストする必要があります。結果として得られるオブジェクトファイルは、コマンドラインでソースファイルに取って代わり、上記と同じ順序で適用できます。
jspencer 2015年

makeを使用してアプリケーションをビルドする場合、どこに-lpthreadを追加する必要がありますか?
codezombie 16

50

エラーメッセージは、ディストリビューション/コンパイラのバージョンによって異なります。

Ubuntu Saucy:

/usr/bin/ld: /mnt/root/ffmpeg-2.1.1//libavformat/libavformat.a(http.o): undefined reference to symbol 'inflateInit2_'
/lib/x86_64-linux-gnu/libz.so.1: error adding symbols: DSO missing from command line

Ubuntu Raring:(参考情報)

/usr/bin/ld: note: 'uncompress' is defined in DSO /lib/x86_64-linux-gnu/libz.so.1 so try adding it to the linker command line

解決策:リンクの段階で、コンパイル手順にライブラリがない可能性があります。私の場合、makefile / GCCフラグに「-lz」を追加しました。

背景: DSOは動的共有オブジェクトまたは共有ライブラリです。


1
このソリューションを使用して、LDFLAGSに-lzを追加することで同じエラーが発生する別のプロジェクトを構築しましたが、完全に機能しました。ありがとう!
Mark Ellul 2014

エラーがまだ残っています:/ usr / bin / ld:gaSim.o:未定義のシンボル 'pthread_create @@ GLIBC_2.1'への参照/lib/i386-linux-gnu/libpthread.so.0:シンボル追加エラー:DSOコマンドラインから欠落
Aerox

'-lpthread'を追加することで一部解決しましたが、今では私に表示されます:gaSim.c :(。text + 0x11d6): `glewInit 'への未定義の参照
Aerox

@Aerox:glewInit必要なもの-lGLEW
mchiasson

19

バックグラウンド

DSO missing from command lineそれは通常の検索だとリンカが必要なシンボルが見つからないときにメッセージが表示されますが、シンボルが直接指定された動的ライブラリの依存関係の1つで利用可能です。

以前は、リンカは指定された言語の依存関係のシンボルを使用可能と見なしていました。しかし、それは一部の新しいバージョンで変更され、リンカは何が利用可能かについてより厳密なビューを適用します。したがって、メッセージはその移行を支援することを目的としています。

何をすべきか?

あなたがソフトウェアのメンテナーなら

この問題は、必要なシンボルを満たすために必要なすべてのライブラリーがリンカーコマンドラインで直接指定されていることを確認することによって解決する必要があります。また、順序がしばしば重要であることも覚えておいてください。

ソフトウェアをコンパイルしようとしているだけの場合

回避策として、それはシンボルがオプションを使用して利用可能であるかのより寛容なビューに切り替えることが可能です-Wl,--copy-dt-needed-entries

これをビルドに挿入する一般的な方法は、実行前にLDFLAGSをエクスポートするconfigureか、次のように同様です。

export LDFLAGS="-Wl,--copy-dt-needed-entries"

LDFLAGS="-Wl,--copy-dt-needed-entries"直接渡すことも時々make働くかもしれません。


gccバージョン7.4.0(Ubuntu 7.4.0-1ubuntu1〜18.04.1)はこのフラグを認識しませんでした。
UserX

1
これはgccオプションではないため、-Wl,ビットが不足しているか、このオプションをサポートしていないリンカーがあります。どのリンカーを使用していますか?この回答は、古典的なbinutilsリンカー(ld.bfd)を想定しています。binutilsゴールドリンカー(ld.gold)--copy-dt-needed-entriesは「サポートされていません」と記載されています。そのため、それ(またはこのオプションをサポートしないその他のリンカー)をデフォルトとして使用している場合は、メンテナー向けのセクションに従うか、リンク用に従来のldに切り替える必要がある場合があります。-fuse-ld=ld.bfdそのために使用できると思います。
textshell

14

別のケースを見つけたので、あなたが間違っていると思います。

これは私が持っていたものです:

/usr/lib64/gcc/x86_64-suse-linux/4.8/../../../../x86_64-suse-linux/bin/ld: eggtrayicon.o: undefined reference to symbol 'XFlush'
/usr/lib64/libX11.so.6: error adding symbols: DSO missing from command line

問題は、コマンドラインにDIDが含まれ-lX11ていないことです。ただし、引数にGTKおよびGNOMEライブラリもあったため、依存関係としてlibX11.soを追加する必要があります。

したがって、私に対する唯一の説明は、このメッセージはあなた助けることを意図したものであったかもしれないが、それが適切に行われなかったということです。これはおそらく単純だったでしょう。シンボルを提供するライブラリはコマンドラインに追加されませんでした。

POSIXでのリンケージに関する3つの重要な規則に注意してください。

  • 動的ライブラリには依存関係が定義されているため、依存関係が最も高いライブラリのみを任意の順序で提供する必要があります(静的ライブラリの後)。
  • 静的ライブラリには未定義のシンボルしかありません-それらの依存関係を知ってコマンドラインでそれらすべてを提供するのはあなた次第です
  • 静的ライブラリの順序は常に次のとおりです。最初リクエスタプロバイダが続きます。そうしないと、ライブラリをコマンドラインに追加し忘れたときと同様に、未定義のシンボルメッセージが表示されます。
  • あなたが持つライブラリを指定した場合-l<name>、あなたはそれが取るかどうかを知ることはありませんlib<name>.solib<name>.a。見つかった場合は、動的ライブラリーが優先され、静的ライブラリーはコンパイラー・オプションによってのみ強制できます-それだけです。上記のような問題があるかどうかは、静的ライブラリか動的ライブラリかによって異なります
  • まあ、依存関係は動的ライブラリに欠けているかもしれません:D

それはあなたを助けることを意図しただけでなく、問題の名前を解決するためにリンカによって要求されます。エラーは完全に有効です。コンパイラがそれを許可することにした場合、バイナリランタイムに存在しないものにアクセスするためのsegfaultを取得するだけです。
kevr 2018年

1
さらに、異なるプラットフォームでは、ソースのコンパイル方法が異なる可能性があります。あるシステムでリンクされているものは、別のシステムではリンクされていない場合があります。これは通常は当てはまりませんが、100%妥当です。
kevr 2018年

問題は、それが有効ではないということではありませんが、問題の原因を見つけることは正確には役に立ちません。
Ethouris

7

同じエラーが発生しました。lapackとblasの両方でコードをコンパイルしていました。2つのライブラリが呼び出される順序を切り替えると、エラーはなくなりました。

「LAPACK_LIB = -llapack -lblas」は機能しましたが、「LAPACK_LIB = -lblas -llapack」は上記のエラーを示しました。


9
cmakeで定義されたプロジェクトでこのエラーが発生します...それで、リンカーの順序を間違ったものにするCmakeのバグはありますか?
ピーターカラセフ2015年

@peterkarasevへの返信:使用find_package(Threads)してみてくださいtarget_link_libraries( ... ${CMAKE_THREAD_LIBS_INIT})
activedecay

7

私も同じ問題に遭遇しました。理由はわかりませんが、-lpthreadコンパイラにオプションを追加するだけで、すべてが正常です。

古い:

$ g++ -rdynamic -m64 -fPIE -pie  -o /tmp/node/out/Release/mksnapshot ...*.o *.a -ldl -lrt

次のエラーが発生しました。-lpthread上記のコマンドにオプションを追加すると、OKです。

/usr/bin/ld: /tmp/node/out/Release/obj.host/v8_libbase/deps/v8/src/base/platform/condition-variable.o: undefined reference to symbol 'pthread_condattr_setclock@@GLIBC_2.3.3'
//lib/x86_64-linux-gnu/libpthread.so.0: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status

これでうまくいきました。リンクを行うmakefileのg ++​​コマンドに、2番目の「冗長」-lpthreadを追加する必要がありました。(これは、メイクファイルのLIBSリストにすでに一度表示されています。)また、メイクファイルのLDFLAGS定義に「-L / lib / x86_64-linux-gnu」を追加しました。
UserX、

2

私が見つけたのは、リンカーが不平を言っているライブラリーが問題を引き起こしているものではないということです。おそらく問題がどこにあるかを理解するための巧妙な方法がありますが、これは私がやっていることです:

  • linkコマンドで、リンクされているすべてのライブラリをコメント化します。
  • すべての.oや.soなどをクリーンアップします(通常はクリーンアップで十分ですが、再帰的なfind + rmなどを実行することもできます)。
  • linkコマンドでライブラリのコメントを1つずつ解除し、必要に応じて順序を並べ替えます。

@peter karasev:CentOS7のgcc 4.8.2 cmakeプロジェクトで同じ問題に遭遇しました。「target_link_libraries」セクションでのライブラリの順序は重要です。cmakeは、リストをそのままリンカーに渡すだけだと思います。つまり、正しい順序を試しません。これは理にかなっています-考えてみると、リンクが正常に完了するまでcmakeは正しい順序を知ることができません。



1

を使用distccしてc ++プロジェクトを作成すると、同じ問題が発生しました。最後に、で解決しましたexport CXX="distcc g++"


1

cmakeとpthreadを使用している場合は、次の行を追加してみてください

find_package(Threads)
target_link_libraries(${CMAKE_THREAD_LIBS_INIT})

0

HPCCベンチマーク(HPLと他​​のいくつかのベンチマークを含む)をインストールしていたときに、同じことが起こりました。-lmビルドスクリプトのコンパイラフラグに追加したところ、正常にコンパイルされました。


3
これは、この特定の質問に答えることも、同様の問題の家族に対する一般的な答えを与えることもありません。これは、完全別の質問に対する高度にローカライズされた回答です。
HermannDöppes16年

0

を使用g++する場合は、gcc代わりに実行していないことを確認してください


3
どうして?もう少し詳しく説明してもらえますか?
IvanIvković19年

@IvanIvkovićよく、gccはCコンパイラ、g ++はC ++コンパイラです。C ++はCをコンパイルできますが、gccはC ++をコンパイルできません。
ジャンマルクジマー

0

Makefileの-pthreadライブラリリストの最後に追加してみてください。

それは私のために働いた。


0

CMakeを使用している場合、解決できる方法がいくつかあります。

解決策1:最もエレガントなもの

add_executable(...)
target_include_directories(...)
target_link_libraries(target_name pthread)

解決策2: CMakeを使用するfind_package

find_package(Threads REQUIRED) # this will generate the flag for CMAKE_THREAD_LIBS_INIT

add_executable(...)
target_include_directories(...)
target_link_libraries(target_name ${CMAKE_THREAD_LIBS_INIT})

解決策3: CMakeフラグを変更する

# e.g. with C++ 17, change to other version if you need
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17 -pthread")
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.