このリンク要件を回避する唯一の方法は、すべての依存関係の静的ライブラリでプライマリ ライブラリをコンパイルすることですか?
いいえ。共有ライブラリ自体が、依存する共有ライブラリにリンクできます。ほとんどのリンカーはこれらのライブラリも選択し、リンカーの段階で言及しなくても、実行可能ファイルをそれらのライブラリにリンクします。
あなたの場合、共有ライブラリが必要なライブラリにリンクしていないようです。lddツールは、この点で役立ちます。
例として、次の共有ライブラリを作成するとします。
gcc -shared foo.o -o libfoo.so -lm
これでlibfoo.so
、数学ライブラリ (libm) にリンクされます。libfoo.so にリンクされたアプリケーションは、libm にもリンクされます。
gcc -o prog main.o -lfoo
一方、共有ライブラリが lib にリンクされておらず、
gcc -shared foo.o -o libfoo.so
アプリケーションをリンクするときは、libm に明示的にリンクする必要があります。
gcc -o prog main.o -lfoo -lm
共有ライブラリを dlopen() すると、実行時リンカーは、共有ライブラリがリンクされているすべてのライブラリを読み込みます (まだ読み込まれていない場合を除く)。したがって、dlopen() するライブラリが依存するライブラリに対してリンクされておらず、実行可能ファイルもそれらのライブラリに対してリンクされていない場合、dlopen() は失敗します (RTLD_LAZY を指定しない限り、後で失敗します)。