回答:
参照する:
http://linux.derkeiler.com/Newsgroups/comp.os.linux.development.apps/2004-05/0436.html
リンクするには、ライブラリの静的バージョンが必要です。
共有ライブラリは、実際には、エントリポイントが指定された(そしていくつかのスティッキーアドレッシングの問題が含まれた)特別な形式の実行可能ファイルです。静的にリンクするために必要なすべての情報が含まれているわけではありません。
共有ライブラリを静的にリンクする(または静的ライブラリを動的にリンクする)ことはできません。
このフラグ-static
により、リンカーは共有(.so)ライブラリではなく静的ライブラリ(.a)を使用するようになります。ただし、静的ライブラリは常にデフォルトでインストールされるわけではないため、自分で静的ライブラリをインストールする必要がある場合があります。
別の考えられるアプローチは、スタティファイアまたはErmineを使用することです。両方のツールは、動的にリンクされた実行可能ファイルを入力として受け取り、出力として、すべての共有ライブラリが埋め込まれた自己完結型の実行可能ファイルを作成します。
libapplejuiceを静的にリンクしたいが、たとえばliborangejuiceをリンクしたくない場合は、次のようにリンクできます。
gcc object1.o object2.o -Wl,-Bstatic -lapplejuice -Wl,-Bdynamic -lorangejuice -o binary
注意点があります-をliborangejuice
使用する場合libapplejuice
、libapplejuice
動的にリンクされます。
あなたはリンクする必要がありますliborangejuice
と一緒に静的にlibapplejuice
取得するためにlibapplejuice
静的に。
そして、-Wl,-Bdynamic
他のものを維持することを忘れないでください。libc
これは、すべてを静的にリンクすることになります(これは良いことではありません)。
gcc -o main main.cc -Wl,-rpath=. -Wl,-Bdynamic -lB -Wl,-Bstatic -lA -Wl,-Bdynamic -L.
libBは使用していますLIBAは、それがリンクされ、ldd
参照表示されませんLIBAを。実行可能ファイルは正常に動作します。g ++ 4.7.3でテスト済み。
共有ライブラリ(.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とその依存パッケージにリンクされているすべてのライブラリを読み取り、それらをすべてcde-package /(同じディレクトリにある)というフォルダに保存します。
ポータブルプログラムを起動するには、cde-package / nmap.cdeにあるバイナリを実行する必要があります。
宜しくお願いします