GNU/Linux >> Linux の 問題 >  >> Linux

gcc の共有ライブラリ関数のスタティック リンク

参照:

http://www.linuxquestions.org/questions/linux-newbie-8/forcing-static-linking-of-shared-libraries-696714/

リンクするにはライブラリの静的バージョンが必要です。

共有ライブラリは、実際には、エントリ ポイントが指定された特別な形式の実行可能ファイルです (およびいくつかのスティッキー アドレッシングの問題が含まれます)。静的にリンクするために必要なすべての情報が含まれていません.

共有ライブラリを静的にリンクする (または静的ライブラリを動的にリンクする) ことはできません。

フラグ -static リンカが共有 (.so) ライブラリの代わりに静的ライブラリ (.a) を使用するように強制します。ただし、静的ライブラリは常にデフォルトでインストールされるとは限らないため、静的ライブラリを自分でインストールする必要がある場合があります。

もう 1 つの可能なアプローチは、statifier または Ermine を使用することです。どちらのツールも、動的にリンクされた実行可能ファイルを入力として受け取り、すべての共有ライブラリが埋め込まれた自己完結型の実行可能ファイルを出力として作成します。


共有ライブラリ (.so) の .a ファイルがある場合は、次のように、オブジェクト ファイルであるかのようにフル パスで単純に含めることができます。

これにより、コンパイルするだけで main.o が生成されます。

gcc -c main.c

これにより、そのオブジェクト ファイルが対応する静的ライブラリにリンクされ、実行可能ファイル (「main」という名前) が作成されます。

gcc main.o mylibrary.a -o main

または単一のコマンドで:

gcc main.c mylibrary.a -o main

絶対パスまたは相対パスの場合もあります:

gcc main.c /usr/local/mylibs/mylibrary.a -o main

リンクしたい場合は、libapplejuice と言ってください 静的ですが、たとえば liborangejuice ではありません 、次のようにリンクできます:

gcc object1.o object2.o -Wl,-Bstatic -lapplejuice -Wl,-Bdynamic -lorangejuice -o binary

警告があります -- liborangejuice の場合 libapplejuice を使用 、次に libapplejuice も動的にリンクされます。

liborangejuice をリンクする必要があります libapplejuice と一緒に静的に libapplejuice を取得する

-Wl,-Bdynamic を維持することを忘れないでください そうしないと、 libc を含むすべての静的なものをリンクすることになります (これは良いことではありません)。


ええ、これが 8 年前の質問であることは承知していますが、共有オブジェクト ライブラリに対して静的にリンクすることは可能であると言われました。詳細を検索したところ、これが文字どおりトップ ヒットでした。

ld では共有オブジェクト ライブラリを静的にリンクできないことを実際に示す (gcc のリンカー) -- 不可能だと主張する大勢の人々とは対照的に -- 次の gcc を使用してください コマンド:

gcc -o executablename objectname.o -Wl,-Bstatic -l:libnamespec.so

(もちろん objectname.o をコンパイルする必要があります sourcename.c から 、おそらく独自の共有オブジェクト ライブラリも作成する必要があります。その場合は、-Wl,--library-path,. を使用してください ld がローカル ディレクトリでライブラリを見つけられるようにします。)

実際に表示されるエラーは次のとおりです:

/usr/bin/ld: attempted static link of dynamic object `libnamespec.so'
collect2: error: ld returned 1 exit status

お役に立てば幸いです。


Linux
  1. Linux –ライブラリ関数への呼び出しのシステム全体の監視?

  2. Linux 上の C++ 動的共有ライブラリ

  3. g++ を使用した動的共有ライブラリのコンパイル

  1. 複雑なプログラムを静的にリンクする方法

  2. 静的ライブラリを動的にロードしますか?

  3. Linux で共有ライブラリのバージョン管理を行う方法は?

  1. 警告:静的ライブラリに対する共有ライブラリのリンクは移植可能ではありませんの意味は何ですか?

  2. 共有オブジェクト (.so)、静的ライブラリ (.a)、および DLL (.so) の違いは?

  3. 共有ライブラリ (.so) は、ローディング プログラムに実装されている関数をどのように呼び出すことができますか?