Gccで共有ライブラリ関数を静的にリンクするにはどうすればよいですか?
参照する:
http://linux.derkeiler.com/Newsgroups/comp.os.linux.development.apps/2004-05/0436.html
リンクするには、ライブラリの静的バージョンが必要です。
共有ライブラリは、実際には、エントリポイントが指定された特別な形式の実行可能ファイルです(およびスティッキアドレス指定の問題も含まれます)。静的にリンクするために必要なすべての情報がありません。
共有ライブラリを静的にリンクすることはできません(または静的に動的にリンクすることもできません)
フラグ-staticを指定すると、リンカーは共有(.so)ではなく静的ライブラリ(.a)を使用します。静的ライブラリは常にデフォルトでインストールされるとは限りません。したがって、静的リンクが必要な場合は、静的ライブラリをインストールする必要があります。
別の可能なアプローチは、 statifier または Ermine を使用することです。両方のツールは、入力として動的にリンクされた実行可能ファイルを取り、出力としてすべての共有ライブラリが埋め込まれた自己完結型実行可能ファイルを作成します。
libapplejuiceを静的にリンクしたいが、liborangejuiceではない場合は、次のようにリンクできます。
gcc object1.o object2.o -Wl,-Bstatic -lapplejuice -Wl,-Bdynamic -lorangejuice -o binary
警告があります-liborangejuice
がlibapplejuice
を使用する場合、libapplejuice
も動的にリンクされます。
liborangejuice
staticを取得するには、libapplejuice
と一緒にlibapplejuice
を静的にリンクする必要があります。
-Wl,-Bdynamic
を保持することを忘れないでください。そうしないと、libc
(これは良いことではありません)を含め、すべてを静的にリンクすることになります。
共有ライブラリ(.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
ええ、私はこれが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
お役に立てば幸いです。
少し遅れましたが... ...数年前に保存したリンクを見つけました。
CDE:ポータブルLinuxアプリケーションを自動作成
http://www.pgbovine.net/cde.html
移植可能にするバイナリの名前を引数として渡すバイナリを実行します。例:nmap
./cde_2011-08-15_64bit nmap
プログラムはnmapとその依存にリンクされているすべてのlibを読み取り、それらをすべてcde-package /というフォルダーに保存します(同じ場所にあなたがいるディレクトリ)。
ポータブルプログラムを起動するには、cde-package/nmap.cdeにあるバイナリを実行する必要があります。
宜しくお願いします
Gccでは、これはサポートされていません。実際、これは私が知っている既存のコンパイラ/リンカーではサポートされていません。