1

共有ライブラリを他の開発者にコンパイルしたいのですが、ソースコードを出荷していません。g ++ 4.6に対して作成した.soファイルですが、g++4.4を使用していました。それらが私の.soファイルとリンクしたとき、g++は次のように報告しました:「memcpy@GLIBC_2.14」への未定義の参照。

私は2つの可能な解決策があると思います:

  1. 指定されたGLIBCバージョンに依存しない共有ライブラリを再構築します。

  2. 共有ライブラリをいくつかのコンパイラオプションでリンクして機能させる簡単な方法を教えてください。

私は両方の方法でわかりません、どうすればこれらの解決策またはそれらの1つを達成できますか?

ありがとう。

編集:

リンクフラグを見つけました:-static-libgcc

このオプションを使用して共有ライブラリを構築する場合、それは役に立ちますか?何か欠点はありますか?

4

2 に答える 2

4

そのシンボルは、GCCではなくglibc(Cライブラリ)によって定義されて-static-libgccいるため、影響がないだけなので、少しでも役に立ちlibgccませんlibc

コンパイラとリンカにmemcpyこのような古いシンボルを使用させることができます(x86_64でコンパイルしていると想定しているので、使用している古いglibcにはおそらくしかありません。x86を使用している場合はmemcpy@GLIBC_2.2.5、代わりに使用することをお勧めしますmemcpy@GLIBC_2.0) :

__asm__(".symver memcpy,memcpy@GLIBC_2.2.5");
memcpy(tgt, src, n);

.symverディレクティブにより、すべての参照がデフォルトではなくmemcpyシンボルにバインドされます。これはあなたの場合です。memcpy@GLIBC_2.2.5memcpy@GLIBC_2.14

于 2012-07-18T16:36:33.197 に答える
3

最後に、これらのオプションを追加して、共有ライブラリに依存せずに作成します。

-static-libgcc -static-libstdc++ -nodefaultlibs -shared -fPIC

lddは「静的リンク」を報告し、必要な.soファイルはありません。

これは、ポータブル共有ライブラリを出荷したい人に役立つかもしれません。

于 2012-07-25T15:47:20.497 に答える