QTは、コンパイル時と実行時にさまざまな方法でダイナミックライブラリを呼び出します。コンパイル時にプロファイルにロードするか、QLibraryクラスでロードできます。ランタイムは環境変数に依存し、ダイナミックライブラリは実行可能ファイルディレクトリに直接コピーできます。 Windowsでは、linuxダイナミックライブラリを検索するために固定パスまたは相対パスを設定する必要があります(ps:windowsプログラムはデフォルトで実行可能ファイルのパスでダイナミックライブラリを検索しますが、linuxは検索しません)。
コンパイル時にロード:Proプロジェクトファイルはダイナミックライブラリをロードするので
INCLUDEPATH + =ライブラリヘッダーファイルパス
LIBS + = -L PATH -lLIB、PATHはライブラリが配置されているパス、LIBはライブラリの名前です(-Lはライブラリパス、-lはライブラリ名です。たとえば、ライブラリファイルはlibReceiptPrint.soです。-LReceiptPrintは後で追加する必要があります)
collect2:ldが1の終了ステータスを返しました解決策:ライブラリが正しくロードされていません。ライブラリが32ビットまたは64ビットのライブラリパスであるかどうかを確認してください。デバッグバージョンまたはリリースバージョンでは、スロット機能は実装されておらず、コンストラクターが定義されており、デストラクタは実装されていません。
INCLUDEPATH += /home/chw/HSCompany/HardWareTest/source/HardWareTest/HardWareTest/sores
CONFIG(debug,debug|release){
LIBS += -L /home/chw/HSCompany/HardWareTest/source/HardWareTest/build-HardWareTest-Desktop_Qt_5_10_1_GCC_64bit-Debug/bin/ -lReceiptPrint
LIBS += -L /home/chw/HSCompany/HardWareTest/source/HardWareTest/build-HardWareTest-Desktop_Qt_5_10_1_GCC_64bit-Debug/bin/ -lInfrared
}
else{
LIBS += -L /home/chw/HSCompany/HardWareTest/source/HardWareTest/build-HardWareTest-Desktop_Qt_5_10_1_GCC_64bit-Release/bin -lReceiptPrint
LIBS += -L /home/chw/HSCompany/HardWareTest/source/HardWareTest/build-HardWareTest-Desktop_Qt_5_10_1_GCC_64bit-Release/bin -lInfrared
}
共有オブジェクトファイルを開くことができません:そのようなファイルまたはディレクトリはありません解決策:
エラーの原因の分析を実行します。LIBS+ = -LPATH -lで追加されたライブラリパスは、コンパイルリンクで使用され、メイクファイルの生成に使用されます。ランタイムライブラリパスは環境内にあります変数の検索、Linuxは現在のパスを検索せず、LD_LIBRARY_PATH変数にライブラリパスを追加するだけです(プログラム検索パスを表示するにはLD_DEBUG = libs xxxを使用します)。
ライブラリをロードした後、コンパイルは正常です。 、実行時にエラーが報告されます。環境変数を追加してみてください。QT-左側のプロジェクト-ビルド環境、追加をクリック、変数LD_LIBRARY_PATH、値$(LD_LIBRARY_PATH):ライブラリファイルパス。
上記は環境変数を追加するためのものです。 qtでは、ソフトウェアがリリースされた後、Linuxシステムで環境変数を設定する必要があります。そうしないと、上記のエラーが報告されます。
コンパイル時にロード:QLibraryはダイナミックライブラリをロードするため、
機会:プロジェクトファイルにダイナミックライブラリをロードするのは便利で迅速ですが、複数のファイルがロードされ、複数のファイルが同じ名前の関数を持っている場合、Linuxシステムはロードされたものを取得する状況があります無視され、混乱を招き、多くの解決策があり、それらのほとんどはライブラリを再コンパイルする必要があります。ここでは、QLibraryクラスを使用して、再コンパイルせずにロード
する方法を紹介します。QLibraryの概要:
QLibraryを使用するプログラムの実行中にダイナミックリンクライブラリをロードするには、QLibraryのインスタンスを単一の共有ライブラリに作用させます。QLibraryライブラリの一般的な使用法は、ライブラリ内のエクスポートされたシンボルを解析し、シンボルで表されるC関数を呼び出すことです。ライブラリはC ++コンパイラによってコンパイルされるため、関数はextern "C"ブロックにパッケージ化する必要があります。また、Windowsプラットフォームでは、dllexportマクロを使用して関数を変更する必要もあります。
コード例:
//例如动态库接口函数为:extern "C" int OpenPort(char* pcInPort, int iInBaud);
typedef int (*Cs_OpenPort)(char* , int );//根据动态库接口函数原型,定义一个函数指针类型
Cs_OpenPort OpenPort;//用新的类型定义一个变量
QLibrary m_ReceiptPrint;//实例化一个QLibrary对象
//加载动态库
m_ReceiptPrint.setFileName("ReceiptPrint");//关联动态库名称
bool isok = m_ReceiptPrint.load();//加载动态库,成功返回true,失败返回false
OpenPort = (Cs_OpenPort)m_ReceiptPrint.resolve("OpenPort");//解析并调用动态库的函数
int ret = OpenPort((char*)"port",38400);//到这里就可以调用动态库接口
ps:QLibraryメソッドはコードが多く、エラーが発生しやすいため、大量に使用することはお勧めしません。同じ名前の関数を持つ複数のライブラリの問題は、パッケージ化段階で回避する必要があります。
ランタイム検索ライブラリパス:固定パス
Linuxシステムは、デフォルトでアプリケーションが配置されているディレクトリ内のライブラリファイルを検索せず、指定されたパスを使用して動的ライブラリを検索します。
パスを修正し、一時的な環境変数を生成し、現在のユーザーを書き込む3つの方法があります。構成ファイルを作成し、システム構成ファイルを書き込みます。
1.ターミナルで実行できます。
=記号をライブラリのパスに置き換えて、環境変数パスの問題かどうかを確認します。このメソッドは、システムの再起動後に失敗します。
export LD_LIBRARY_PATH=/usr/local/lib
2.次のステートメントを〜/ .bashrcに追加します。これは、再起動後に現在のユーザーに対して有効になります。
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
3.すべてのユーザーに有効な別の方法があります。共有ライブラリ構成ファイル/etc/ld.so.confを変更し、ライブラリパスをファイルにコピーして、次のコマンドを実行してすぐに有効にします。
sudo ldconfig
ランタイム検索ライブラリパス:相対パス
展開中に構成ファイルを変更する必要があるなど、固定パスの使用には多くの問題があります。他のプログラムが同じ名前のライブラリに依存しているが、ライブラリのバージョンが異なる場合、プログラムは起動せず、私は遭遇しましたteamviewerがその場で依存するQTライブラリ。ライブラリの名前はQTで開発したときに使用したライブラリと同じですが、バージョンが異なるため、プログラムが失敗します。
したがって、相対パスを使用することをお勧めします。QT開発段階で、プロファイルでライブラリの検索パスを指定し、-rpathを使用してパスをライブラリ検索パスとして指定します。
QMAKE_LFLAGS += -Wl,--rpath=./lib #指定应用程序所在路径的相对路径为库搜索路径
QMAKE_LFLAGS += -Wl,--rpath=. #指定应用程序所在路径为库搜索路径
補足1
qt環境読み込みライブラリがエラーを報告します:シンボルdlcloseへの未定義の参照
次のコンテンツをQTプロジェクトの.proファイルに追加します。
LIBS += -ldl #显式加载动态库的动态函数库
補足2:QTは静的ライブラリの.aファイルをロードします
QLibrary経由ではなく、プロファイルにのみロードできます。プロファイルのロード方法はダイナミックライブラリのロード方法と似ています。たとえば、静的ライブラリ名はlibTool_Fun.aで、ロード方法は次のとおりです。
INCLUDEPATH += /home/chw/HSCompany/QSRM/Pdjserver/dbTest/dbTest//头文件所在路径
LIBS += -L /home/chw/HSCompany/QSRM/Pdjserver/dbTest/build-dbTest-Desktop_Qt_5_10_1_GCC_64bit-Debug/bin -lTool_Fun//LIBS += -L 库路径 -l库名称
ヘッダーファイルをインクルードした後に使用できます。静的ライブラリは実行可能ファイルに直接コンパイルされるため、リリース後にライブラリに依存する必要はありません。
ps1:静的ライブラリを生成する場合、命名規則はlib ***。aです。qtによって生成される静的ライブラリは、デフォルトでこの命名規則を使用します。Gcccompile-oも、この命名規則を使用して静的ライブラリファイル名を指定する必要があります。 qtにロードされます。失敗する可能性があります。
ps2:QTがc言語でコンパイルされた静的ライブラリを呼び出すと、proがライブラリを正常にロードしたことがわかりますが、インターフェイスの呼び出し時にエラーが報告されます。C++とCの互換性の問題である可能性があります。ヘッダーの静的ライブラリインターフェイスファイルはextern "C"でラップされています:
extern "C" {
//c静态库接口
}
extern "C"の役割:コードのこの部分をC ++ではなくC言語でコンパイルするようにコンパイラーに指示します。