2017-01-25 7 views
0

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は他のマシンで動作するので、ビルド環境固有のものですが、何ですか?)

+0

リンクコマンドを表示します。自分でコンパイルしていないバイナリはありますか?/usr/local/lib \ *に何かがありますか? –

+0

これは実際のものです: @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にあります。 –

+0

'/ 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によって自動的に行われます。 –

答えて

0

-L/usr/lib/x86_64-redhat-linux6E/lib64引数で示されるように、おそらくcompat-glibcがインストールされています。 Red Hat Enterprise Linux 7のcompat-glibcはglibc 2.12のみを提供しているため、システムライブラリとのリンクには使用できません。

関連する問題