5

qmake を使用して、自分のシステムでプロジェクトをコンパイルしようとしています。プロジェクトのいくつかの依存関係はインストールされていませんが、多かれ少なかれ次のように私のホームディレクトリに存在します: libs files: /home/myusername/local/liband my includes directory /home/myusername/local/include. インクルード ディレクトリ内にはqjson、ライブラリから必要なヘッダーを含むフォルダーがあります。lib フォルダーにファイルがありますlibqjson.so libqjson.so.0 libqjson.so.0.7.1

私のqmakeプロジェクトファイルは次のようになります。

linux-g++ {
INCLUDEPATH += /home/myusername/local/include/
LIBS += -L/home/myusername/local/lib/ -lqjson
}

生成されたメイクファイルは、次のようなコマンドを生成します。

g++ -c -pipe -g -Wall -W -D_REENTRANT -DQT_GUI_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB \
    -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I../qbuzz \
    -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtNetwork -I/usr/include/qt4/QtGui \
    -I/usr/include/qt4 -I/home/myusername/local/include/ -I. -I. -I../myproject -I. \
    -o qbuzz-result.o ../myproject/myfile.cc

-I私のインクルードディレクトリがgccのオプションにあることは明らかです。myfile.cc次のようなインクルードが含まれています。

#include <qjson/parser.h>

ただし、make を実行すると、次のエラーが表示されます。

../myproject/myfile.cc:2:26: fatal error: qjson/parser.h: No such file or directory
compilation terminated.

ここで、環境変数を変更しCPLUS_INCLUDE_PATHてローカル インクルード ファイルを追加すると、問題はありませんが、リンカー ステージでエラーが発生しました。

/usr/bin/ld: cannot find -lqjson
collect2: ld returned 1 exit status

リンカーコマンドは次のとおりでしたが:

g++ -omyprogram main.o mainwindow.o myfile.o moc_mainwindow.o -L/usr/lib \
    -L/home/myusername/local/lib/ -lqjson -lQtGui -lQtNetwork -lQtCore -lpthread 

環境変数の変更も回避できますLIBRARY_PATH。ただし、できるだけ少ない環境変数を変更することに依存するソリューションを探しています。結局のところ、オプション -L と -I があるのはなぜですか?

MinGW g++ を使用して Windows で問題なく動作します。

4

2 に答える 2

1

QT の自動インクルード パスには末尾のスラッシュがないことに気付きました。末尾にスラッシュを付けずにパスを書いてみましたか?

linux-g++ {
 INCLUDEPATH += /home/myusername/local/include
 LIBS += -L/home/myusername/local/lib -lqjson
}
于 2011-07-23T19:42:27.810 に答える
1

G++ とその仲間 (つまり、as、ld など) は、ヘッダー ファイルとライブラリ ファイルを探す場所を正確に教えてくれません。これをデバッグする 1 つの方法は、実行することstrace -o output.txt -eopen -s 1024 -f qmakeです。これにより、すべてのシステム コールとそれが fork するすべての子プロセスのqmakeログが実行されます。次に、ヘッダー ファイル (およびライブラリ) を検索するディレクトリと順序を確認できます。stdio.h の出力抽出例:openqmake

26069 open("/usr/lib/gcc/x86_64-redhat-linux/4.6.0/include/stdio.h", O_RDONLY|O_NOCTTY) = -1 ENOENT (No such file or directory)
26069 open("/usr/local/include/stdio.h", O_RDONLY|O_NOCTTY) = -1 ENOENT (No such file or directory)
26069 open("/usr/include/stdio.h", O_RDONLY|O_NOCTTY) = 4
于 2011-07-23T19:50:06.707 に答える