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
何かヒントや指摘があれば教えてください。
オブジェクトファイルをコンパイルした後に、コマンドラインでライブラリを指定する必要があります。
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
エラーメッセージは、ディストリビューションやコンパイラのバージョンに依存します。
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は、動的共有オブジェクトまたは共有ライブラリのことです。
私は別のケースを見つけたので、あなたはすべて間違っていると思います。
これは私が持っていたものです:
/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
問題は、コマンドラインに「-lX11」が含まれていないことです。ただし、引数にはGTKおよびGNOMEライブラリも存在するため、libX11.soを依存関係として追加する必要があります。
したがって、私にとっての唯一の説明は、このメッセージがあなたを助けるを意図していたかもしれないが、それが適切に行われなかったということです。 これはおそらく単純でした。シンボルを提供するライブラリはコマンドラインに追加されませんでした。
POSIXのリンケージに関する3つの重要なルールに注意してください。
動的ライブラリには依存関係が定義されているため、上位の依存関係からのライブラリのみが任意の順序で提供する必要があります(静的ライブラリの後)。 静的ライブラリには未定義のシンボルしかありません-それらの依存関係を知り、コマンドラインにそれらすべてを供給するのはあなた次第です。
-l< name>
を使用してライブラリを指定すると、 lib< name> .so
またはlib< name> .a
を使用するかどうかわかりません。 動的ライブラリが見つかった場合は優先され、静的ライブラリはコンパイラオプションによってのみ強制できます-それだけです。 上記のように問題があるかどうか、静的ライブラリと動的ライブラリのどちらがあるかによって異なります。
*まあ、時々依存関係が動的ライブラリに欠けているかもしれません:D。私も同じ問題に遭遇しました。 理由はわかりませんが、コンパイラに「-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
背景。
「コマンドラインに欠落しているDSO」メッセージは、リンカーが通常の検索で必要な記号を見つけられないが、記号が直接指定された動的ライブラリの依存関係の1つで利用できる場合に表示されます。
過去に、リンカーは特定の言語の依存関係にあるシンボルが利用可能であると考えていました。 しかし、それは後のバージョンで変更され、現在リンカーは利用可能なものについてより厳密な見解を強制しています。 したがって、メッセージはその移行を支援することを目的としています。
何をすべきか?。
ソフトウェアのメンテナである場合。
必要なシンボルを満たすために必要なすべてのライブラリがリンカーコマンドラインに直接指定されていることを確認して、この問題を解決する必要があります。 また、順序はしばしば重要であることを覚えておいてください。
ソフトウェアをコンパイルしようとしているだけの場合。
回避策として、オプション「-Wl、-copy-dt-need-entries」を使用して、利用可能なシンボルのより寛容なビューに切り替えることができます。
これをビルドに注入する一般的な方法は、次のように「構成」または同様のものを実行する前にLDFLAGSをエクスポートすることです。
。 LDFLAGS = "-Wl、-copy-dt-need-entries"をエクスポートします。
。
LDFLAGS = "-Wl、-copy-dt-need-entries"
を直接 make
に渡すことも機能する場合があります。
私が見つけたのは、リンカーが不満を言うライブラリが問題を引き起こしているものではないということです。 おそらく、問題がどこにあるかを理解するための巧妙な方法がありますが、これが私がすることです。
-linkコマンドでリンクされているすべてのライブラリにコメントします。 -すべての.o、.soなどをクリーンアップします(通常、クリーン作成で十分ですが、再帰的な検索+ rm、または同様のものを実行することをお勧めします)。 -リンクコマンドのライブラリを一度に1つずつアンコメントし、必要に応じて順序を再配置します。
@peter karasev:CentOS7のgcc 4.8.2 cmakeプロジェクトで同じ問題が発生しました。 "target_link_libraries"セクションのライブラリの順序は重要です。 cmakeはリストをそのままリンカーに渡すだけだと思います。 正しい順序で解決しようとはしません。 これは合理的です-考えてみると、リンクが正常に完了するまで、cmakeは正しい順序を知ることができません。