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

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

オブジェクト ファイルが libmxml.a にあることを確認します。 -fPIC でビルドされました .共有ライブラリを構築する必要があります。 http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.htmlも参照してください

ここに簡単な例があります

$ cat stat.c 
int five() { return 5; }
$ gcc -c stat.c -fPIC
$ ar crus libstat.a stat.o
$ cat dynamic.c
int ten() { return five() + five(); }
$ gcc -c dynamic.c -fPIC
$ gcc -shared -o libdyn.so dynamic.o -L. -lstat
$ ldd libdyn.so # Just to show static linkage to libstat.a
  linux-vdso.so.1 =>  (0x00007fffca1b8000)
  libc.so.6 => /lib/libc.so.6 (0x00007fc004649000)
  /lib/ld-linux-x86-64.so.2 (0x00007fc004bf7000)
$ cat main.c 
int main() { return ten(); }
$ gcc main.c -L. -ldyn
$ LD_LIBRARY_PATH=. ./a.out 
$ echo $?
10

共有ライブラリを静的ライブラリにリンクすることはできません (自分が何をしているのかを本当によく知っている場合を除きます)。しないでください。

最初の警告は libtool からのものです。それは、あなたが要求した操作が異なるシステムで異なることを行い、それらのいくつかはおそらくあなたが望んでいるものではないことを示しています.共有ライブラリと静的ライブラリに含まれるコードは、異なるコンパイラ フラグでコンパイルする必要があるため、多くの場合、さまざまな目を見張るような方法で失敗します。

2 番目の警告は gcc からのものです。 コンパイル時に静的ライブラリを提供することを伝えています 無意味です。それは $(PATH)/libmxml.a があるからです CFLAGS で 、それが存在するビジネスを持っていない場所。実際、ほとんどの場合、すべきではない $(PATH)/libmxml.a を持っている 、しかし -L$(PATH) -lmxml 代わりは。それはまだ LDFLAGS にあるはずです 、しかし、これがコンパイラのコマンドラインにも行われる場合、gcc は文句を言いません。


<ブロック引用>

共有ライブラリ libgstmatroskademux.la を静的ライブラリにリンクする

これは、たとえば次の場合に警告しています。これを 64 ビット Linux でビルドしようとすると、失敗する可能性があります。これは、x86_64 では、共有ライブラリにリンクされるすべてのコードがしなければならないためです。 -fPIC でコンパイルされる フラグ、および .a に存在するコード ライブラリは通常そうではありません。

<ブロック引用>

gcc:.../libmxml.a:リンクが行われていないため、リンカ入力ファイルは使用されていません

これは、偽のコマンド ラインがあることを警告しています。ほとんどの場合、何かをコンパイルしていて、-c を持っています コマンドラインで (ソースのコンパイル後に停止するよう GCC に指示し、停止 リンクを実行します)。 libmxml.a も提供しているので 同じコマンド ラインで、GCC は、自分が何をしているのかわからないことに気付き、それについて (もっと) 考えるように警告しました。


Linux
  1. LD_PRELOAD トリックとは何ですか?

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

  3. *nix とはどういう意味ですか?

  1. Linux のメッセージ キューの短所は何ですか?

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

  3. 共有ライブラリを構築するための「soname」オプションは何ですか?

  1. Linux での fork() と grep の意味は何ですか?

  2. リンクエラーに対する再配置R_X86_64_32S

  3. GStreamer での「ブラックリスト」の意味は何ですか?