5

Qmakeを使用してUbuntu9.10で共有ライブラリを構築しています

この共有ライブラリ(A)は、別の共有ライブラリ(B)に依存しています。

プロジェクトBは正常にビルドされました。

プロジェクトAの.proファイルでは、私のLIBS変数は次のようになります。

LIBS += -L../datelib/bin -llibdatelib_release.so.1.0.0

(ライブラリのバージョンが異なるため、完全なshlib名を使用しました。)

いずれにせよ、プロジェクトAをビルドしようとすると、リンクの段階で壊れて、エラーメッセージが出力されます。

/usr/bin/ld: cannot find -llibdatelib_release.so.1.0.0
collect2: ld returned 1 exit status
make[1]: ***[bin/libprojecta_release.so.6.0.0] Error 1
make ***[release] Error 2
Exited with code 2

エラーメッセージから、ldがlibdatelibファイルを見つけることができないと文句を言っていると思ったので、手動で/ usr /lib/にコピーしました。

ただし、それでも問題は解決せず、同じエラーメッセージが表示されます。

誰もがこれを修正する方法を知っていますか?

[編集]

私はgccを使用してビルドするのはまったく新しいです。シンボリックリンクを作成する方法は知っていますが、lnkコマンドにどのパスを使用しますか?リンクしたいファイルは/home/ username / work / cppdev / datelib/binにあります。

また、私が使用しているビルドシステム(qmake)は、ビルドの一部としてシンボリックリンクを自動的に作成するため、/ home / username / work / cppdev / datelib/binフォルダーに次のファイルが既にあります。

  • libdatelib_release.so(シンボリックリンク)
  • libdatelib_release.so.1(シンボリックリンク)
  • libdatelib_release.so.1.0(シンボリックリンク)
  • libdatelib_release.so.1.0.0(共有ライブラリ)

シンボリックリンクが非常に多い理由(ポイントは何ですか?)と、共有ライブラリに直接リンクできないのにシンボリックリンクを経由する必要がある理由を説明するために、別の質問をする必要があるかもしれません。私はいくつかのオンラインドキュメントを読みましたが、これまでに見たものは、実際の技術的な理由ではなく、ディクタム/伝統のように見えます。Linuxでリンクするときにこのレベルの抽象化が必要な理由。

4

3 に答える 3

9

そのように -l を使用することはできません。-l は、-lFOO を介して、libFOO.so のような名前のもののみを検索できます。ビルドでこのように指定する場合は、バージョン番号のないシンボリック リンクが必要です。

何かのようなもの:

ln -s /the/path/to/the/libthing.so.1.0.0 /the/path/to/the/libthing.so

これで -lthing が動作します。

于 2010-02-18T12:30:37.400 に答える
3

接頭辞「lib」がライブラリ名に自動的に追加されます - 次を使用します:

LIBS += -L../datelib/bin -ldatelib_release.so.1.0.0
于 2010-02-18T12:31:27.613 に答える
0

フルパスを指定できます。すなわち

LIBS += ../datelib/bin/libdatelib_release.so.1.0.0

ただし、bmargulies が提案したことを行うことをお勧めします: シンモリック リンクを作成し、-ldatelib_release を追加します。

于 2010-02-18T12:34:52.710 に答える