0

共有オブジェクト (.so) /ダイナミック リンク ライブラリ (.dll)について学習しています。私は Linux を使用しているため、関連するのは.soファイルのみです。とにかく、共有ライブラリをコンパイルすると、複数の.soファイルが生成されます。そのほとんどはリンクのみです。スクリーンショットは次のとおりです。

ここに画像の説明を入力

次に、別の Qt コンソール アプリケーション プロジェクトを作成して、この SO をテストしました。すべてのヘッダー ファイルを設定し、すべての .so ファイルを前のスクリーンショットからこの新しいプロジェクトにコピーして追加しました

LIBS += "libAritmeticnoKodiranjeDLL.so"

プロジェクト設定へ。プロジェクトをコンパイルすると、OK になります。しかし、テストアプリを実行すると、次のエラーが発生します。

./DLLTester: 共有ライブラリの読み込み中にエラーが発生しました: libAritmeticnoKodiranjeDLL.so.1: 共有オブジェクト ファイルを開けません: そのようなファイルまたはディレクトリはありません

問題はどこにあり、なぜ大量の .so ファイルを取得するのですか?

4

3 に答える 3

1

ただ行う:

LIBS += -lAritmeticnoKodiranjeDLL

ライブラリのプレフィックス (「lib」) とサフィックス (「.so」) の詳細は、リンカーによって処理されます。

于 2012-11-02T21:27:17.830 に答える
1

1 つを除いてすべてシンボリック リンクであり、実際のファイルは最も正確なバージョンのファイルであることに注意してください。これは、異なるバージョンのライブラリをサポートするためのものです。バージョンが完全に定義されていない場合、シンボリック リンクによって、使用される正確なバージョンが決まります。ライブラリをシステム ライブラリ フォルダにインストールする場合、これは重要なことですが、アプリケーションと一緒に 1 つの非共有バージョンを配布するだけの場合は、バージョン番号なしの名前を使用できます。

カスタム ライブラリを使用してアプリケーションを実行する場合、ディレクトリを LD_LIBRARY_PATH 環境変数に追加して、実行時リンカーがそれらを検出できるようにする必要があります。https://stackoverflow.com/search?q=LD_LIBRARY_PATHを参照してください。トラブルシューティングのために、実行ldd yourprogramして実際にロードされている共有ライブラリecho $LD_LIBRARY_PATHを確認し、LD_LIBRARY_PATH が想定どおりであることを確認できます。

于 2012-11-02T21:32:10.450 に答える
1

私の現在の経験から、QtCreator 4.0.3 と Linux (Ubuntu 16.04) で Qt 5.7 を使用して共有ライブラリをビルドする場合 ( を使用TEMPLATE = lib)、結果のターゲットがlibName.so(変更されていない場合CONFIG += unversioned_libname) またはlibNAME.so.1.0.0(CONFIG変更されていない場合) であることを確実に確認できます。ただし、まったく同じ環境で構築されたアプリケーションは、リンク中にそのライブラリ ( ) に対して正しくリンクされますがLIBS += -Lfolder -lNAME、残念ながら実行時に要求されます。ファイルを作成します)。これをすべて理解するために2営業日を費やしました。唯一の方法は、アプリケーションの要求に合わせて、生成された .so ファイルの名前を手動で変更することです。linName.so.1error while loading shared libraries: libNAME.so.1: cannot open shared object file: No such file or directorylibName.so.1

于 2016-11-16T19:51:28.727 に答える