私のUbuntu jammy Linux PCにapt-get install libuv1
libuv1パッケージ()をインストールした後、次の名前のファイルと次のlibuv.so.1.0.0
名前のシンボリックリンクがあることを確認しましたlibuv.so.1
。
$ find /usr -name "libuv.so*" 2>/dev/null
/usr/lib/x86_64-linux-gnu/libuv.so.1.0.0
/usr/lib/x86_64-linux-gnu/libuv.so.1
$ ls -l /usr/lib/x86_64-linux-gnu/libuv.so*
lrwxrwxrwx 1 root root 14 Jan 15 2022 /usr/lib/x86_64-linux-gnu/libuv.so.1 -> libuv.so.1.0.0
-rw-r--r-- 1 root root 198744 Jan 15 2022 /usr/lib/x86_64-linux-gnu/libuv.so.1.0.0
$
libuv.so
おそらく不完全な理解のためにシンボリックリンクもあると予想しました/usr/lib/x86_64-linux-gnu/libuv.so -> libuv.so.1
。
私はこれらのシンボリックリンクの存在/不在のブレンドを見ましたが、.so
その後に理由/慣習があるかどうかを正しく理解していませんでした。
おそらく私は答えを偶然見つけたと思います。このブログ投稿。投稿の内容を正しく理解した場合:
- .soファイルのセマンティックバージョン(例:シンボリック
libfoo.so.1.0.0
リンクが最終的に検証される実際のファイルsoname
)gcc -I . foo.c -shared -Wl,-soname=libfoo.so.1 -o libfoo.so.1.0.0
- このオプションが使用されるため、バイナリが
soname
(-lfoo
リンクが存在する環境で)にコンパイルされたときに、コンパイラ/リンカは、としてコンパイルされたと判断されることをlibfoo.so -> libfoo.so.1 -> libfoo.so.1.0.0
探します。したがって、バイナリは次のものが必要であることがわかります。実行時にコンパイルされます。 (つまり、同様の内容がバイナリファイルに出力されます)libfoo.so
libfoo.so.1.0.0
-soname=libfoo.so.1
libfoo.so.1
readelf -d
0x0000000000000001 (NEEDED) Shared library: [libfoo.so.1]
libfoo.so.1 -> libfoo.so.1.0.0
バイナリは(つまり、なし)環境で実行するとうまく動作します。上記の理由のために、代わりに、libfoo.so -> libfoo.so.1
を探します。libfoo.so.1
libfoo.so
私の推測:これはあなたが開発する共有ライブラリの場合はフラグを指定する必要があるため、シンボリックリンクが必要です。たとえば、libfoo.so
この場合、コンパイラ/リンカーが代わりにそれを見つけるという意味です。-l
g++ use-foo.cpp -o ./use-foo -lfoo
-lfoo
libfoo.so
libfoo.so.*
上記は、動的にリンクされた単純なhello-worldの例をコンパイルし、パッケージと共にインストールされているlibuv1
ものを確認するようですlibuv1-dev
。
$ apt-file list libuv1 | grep so.*
libuv1: /usr/lib/x86_64-linux-gnu/libuv.so.1
libuv1: /usr/lib/x86_64-linux-gnu/libuv.so.1.0.0
$
$ apt-file list libuv1-dev | grep so.*
libuv1-dev: /usr/lib/x86_64-linux-gnu/libuv.so
$
ところでファイルを発見した瞬間作業が中断され、シンボリックリンクではありません、たとえば、次のようになりますlibmemusage.so
(例をランダムに選択しました)。
$ ls -l /usr/lib/x86_64-linux-gnu/libmemusage.so
-rw-r--r-- 1 root root 18904 Sep 25 07:45 /usr/lib/x86_64-linux-gnu/libmemusage.so
私の質問は次のとおりですlibfoo.so
libfoo.so.x
、、、との関係libfoo.so.x.y.z
、それらの特定の組み合わせが存在する時期と理由、それらの1つがファイルまたはシンボリックリンクでなければならない時期と理由を説明する包括的な規則はありますか?
開発者ではなくLinux PCユーザーとして「欠落している」シンボリックリンクを生成する必要がある状況はありますか(例:質問の冒頭で見たが見えlibuv.so.1
なかったlibuv.so
)。 (この質問の背景:過去には、および/libfoo.so
またはlibfoo.so.x
存在するときに「欠けている」シンボリックリンクを生成するように求められていましたが、libfoo.so.x.y.z
「常に存在する」という説は、概念に加えてこれがなぜ必要なのかを正しく理解していません。 「該当する」ファイルが.so
あるようです)。.so.x
.so.x.y.z
(この質問がどのようにスタックオーバーフローに属するかを知ることができます。プログラミングとは関係ありませんが、最終的に質問の核心はUnix / Linuxルールに関するものだと思います。適しています。