Redhat Linux上のプログラムと共有ライブラリをリンクしようとすると、未定義のシンボルが表示されます。
は、我々は、Linuxカーネル3.10.0、libc-2.17.soでGCC 4.8.2を実行している、と私は私が書いているアプリケーションをビルドする場合2.23.2バージョン管理記号(memcpy&secure_getenv)でリンクに失敗しました
私はlibblkidのから2つの未定義のシンボルを取得libblkidのされています[email protected]_2.14
と[email protected]_2.17
。 (非常に似たビルドは、他のマシンでも動作します。表面的には、すべてのバージョンが同じです)。
注:secure_getenv
の場合、libblkidはlibcライブラリ自体と同じバージョンが必要です。
libc-2.17.soで定義されているシンボルを見ると、[email protected]@GLIBC_2.14
,[email protected]_2.2.5
,secure_getenv
および[email protected]_2.2.5
があります。私の理解によると、最初のmemcpy
バージョンのダブル@
は、それを単にデフォルトバージョンとしてマークすることになっています。そして、何らかの理由でバージョン管理されたシンボルを持つこのlibcでも、最初のsecure_getenv
はバージョン管理されていないようです。
なぜ、[email protected]_2.14
の要件がデフォルトの[email protected]@GLIBC_2.14
と一致しないのですか?
論理的には、libc-2.17の基本バージョンsecure_getenv
がバージョン2.17の要件と一致すると期待します。
ここでは何が起こっていますか?私の開発マシンでは何が失敗するのですか?これをどうやって解決するのですか? (makeは他のマシンで動作するので、ビルド環境固有のものですが、何ですか?)
リンクコマンドを表示します。自分でコンパイルしていないバイナリはありますか?/usr/local/lib \ *に何かがありますか? –
これは実際のものです: @nm基本的なリンク行は、cc -o myapp app_main.o file1.o file2.o file3.o -g --verbose -DDEBUG -fPIC -L/usr/lib/gcc -lgccです。 -L/usr/lib/x86_64-redhat-linux6E/lib64/-lm -lpthread -Llib64 -Llib -lcommon -lcrypto -lssl -ldl -lblkid -lnv_env -lnv_io liblzo2は/ usr/local/libにあります libcommon、libcrypto、libsslはプロジェクトレベルの.aファイルです。 S.これは64ビットLinuxであることを忘れていて、ほとんどのライブラリは/ usr/lib64にあります。 –
'/ usr/local/lib *'にあなたのものでないものは何ですか?依存関係の順序でライブラリを並べ替えることを試みてください.http://stackoverflow.com/questions/45135/why-does-the-order-in-which-libraries-are-linked-sometimes-cause -lggcや-L/usr/lib/x86_64-redhat-linux6E/lib64 /のようなものは必要ありません。これらはgccによって自動的に行われます。 –