2

Windows では、多くの .dll に対応する静的な .lib が付属しています。私の理解では、対応する.libには基本的にLoadProcAddress呼び出しが含まれているため、プログラマーが自分で行う必要はありません。基本的に、時間の節約になります。Linuxに切り替えたとき、.dllを.soに、.libを.aに置き換えて、状況は同じであると想定していましたが、これが間違っていることを示している状況になり、何が原因かわかりません進行中:

.a/.so ペアとして提供されるライブラリを使用しています。.a に対してリンクしていましたが、生成されたバイナリに対して ldd を実行すると、対応する .so ファイルへの参照が含まれていませんでした。それで、私は .so ファイルに対してリンクしようとしましたが、驚いたことに、これはうまくいきました。さらに、結果のバイナリに対して ldd を実行すると、.so ファイルが表示されました。

だから、私は何が起こっているのかについて本当に混乱しています。Windows では、.dll ファイルにリンクしようとは思いません。また、Windows では、.dll ファイルに .lib が付随していて、コンパイル時に .lib に対してリンクした場合、実行時に対応する .dll に依存することが予想されます。この場合、これらはどちらも当てはまりません。

はい、Linux の共有オブジェクトに関する基本的なチュートリアルを読みましたが、読んだ内容はすべて、最初の仮定が正しかったことを示しているようです。ところで、私は Code::Blocks を IDE として使用していることに言及する必要がありますが、これは複雑なことを知っていますが、.so ファイルにリンクするように指示すると、単純に交換するだけではないことを 99% 確信しています。結果のバイナリが小さいため、.a ファイル。(加えて、ldd に関するビジネス全体...)

とにかく、事前に感謝します。

4

3 に答える 3

1

.aに対してリンクしていましたが、生成されたバイナリでlddを実行すると、対応する.soファイルへの参照が含まれていませんでした。

これは予想されます。静的にリンクすると、静的ライブラリのコードが結果のバイナリに統合されます。静的ライブラリへの参照や依存関係はもうありません。

そこで、.soファイルに対してリンクを試みましたが、驚いたことに、これは機能しました。

静的リンクが機能しなかったとはどういう意味ですか?すべきではない理由はありません...

于 2011-02-13T03:55:11.517 に答える
1

.lib は、Windows で動的にリンクするために使用されます。Linuxにはそれらがありません。.soに直接リンクします。.a ファイルは静的に構築されたライブラリです。これを使用して静的にリンクします。

于 2018-02-12T07:28:07.130 に答える