参照:
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
お役に立てば幸いです。