web-dev-qa-db-ja.com

gccの共有ライブラリ関数の静的リンク

Gccで共有ライブラリ関数を静的にリンクするにはどうすればよいですか?

124
suresh

参照する:

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

http://linux.derkeiler.com/Newsgroups/comp.os.linux.development.apps/2004-05/0436.html

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

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

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

フラグ-staticを指定すると、リンカーは共有(.so)ではなく静的ライブラリ(.a)を使用します。静的ライブラリは常にデフォルトでインストールされるとは限りません。したがって、静的リンクが必要な場合は、静的ライブラリをインストールする必要があります。

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

98
Sam Liao

libapplejuiceを静的にリンクしたいが、liborangejuiceではない場合は、次のようにリンクできます。

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

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

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

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

73
Eugene Bujak

共有ライブラリ(.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
18
NeoEGM

ええ、私はこれが8年前の質問であることを知っていますが、共有オブジェクトライブラリに静的にリンクすることは可能であると言われました。

共有オブジェクトライブラリを静的にリンクすることはldgccのリンカー)では不可能であることを実際に示すには、不可能だと主張する多くの人々とは対照的に、次の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

お役に立てば幸いです。

7
Ian Moote

少し遅れましたが... ...数年前に保存したリンクを見つけました。

CDE:ポータブルLinuxアプリケーションを自動作成

http://www.pgbovine.net/cde.html

  • プログラムをダウンロードするだけ
  • 移植可能にするバイナリの名前を引数として渡すバイナリを実行します。例:nmap

    ./cde_2011-08-15_64bit nmap

プログラムはnmapとその依存にリンクされているすべてのlibを読み取り、それらをすべてcde-package /というフォルダーに保存します(同じ場所にあなたがいるディレクトリ)。

  • 最後に、フォルダを圧縮して、どのシステムにもポータブルバイナリを展開できます。

ポータブルプログラムを起動するには、cde-package/nmap.cdeにあるバイナリを実行する必要があります。

宜しくお願いします

7
Francis

Gccでは、これはサポートされていません。実際、これは私が知っている既存のコンパイラ/リンカーではサポートされていません。

0
nothrow