2017-07-27 10 views
-1

Qtアプリケーションをコンソールからコンパイルしようとしています。ここに仕様があります: MCBC 3.0(Qtとgccがプリインストールされています)、Qt 4.6.4、gcc v4.1.2、qmake v2.01aGCCはQtライブラリやインクルードファイルを認識できません

私のテスト用qtアプリには、basket.proとmain.cppという2つのファイルしか含まれていません。

basket.pro:

TARGET = basket 
TEMPLATE = app 
SOURCES += main.cpp 
HEADERS += 

main.cppに:

#include <QtGui/QApplication> 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    return a.exec(); 
} 

私はコンソールからそのアプリをコンパイルする必要があります。

私は2台の仮想マシンを持っています。 VM#1はQtCreatorをインストールし、QtCreatorは問題なくこのアプリケーションをコンパイルします。また、アプリケーションは "qmake"と "make"によってコンソールからコンパイルできます。しかし、QtCreatorがインストールされていないVM#2があり、そこから問題が発生しています。 私はQtのライブラリ、インクルードファイル、リンクされたlibsへの明示的に定義されたパスでgccコマンドだけを使用しようとするQtCreatorによって作成されたMakefileを使用しようとする "qmake make"コマンドでアプリケーションをコンパイルしようとしました。例えば、私は成功したコンパイルのためにQtCreatorで、このアプリを使用し2つのgcc comandsを、使用します。

g++ -c -pipe -g -Wall -W -D_REENTRANT -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/lib/qt46/mkspecs/linux-g++ -I. -I/usr/lib/qt46/include/QtCore -I/usr/lib/qt46/include/QtGui -I/usr/lib/qt46/include -I. -o main.o main.cpp 

g++ -o basket main.o -L/usr/lib/qt46/lib -lQtGui -L/usr/lib/qt46/lib -lQtCore -lpthread 

それで2番目のコマンドを実行した後、私はいつもと同じエラーを得た:

[[email protected] basket]# ./build_g++_step2 
main.o: In function `basic_string<char, string_char_traits<char>, __default_alloc_template<true, 0> >::data(void) const': 
/usr/lib/gcc-lib/i586-linux/2.95.4/../../../../include/g++-3/std/bastring.h:152: undefined reference to `QApplication::QApplication(int &, char **, int)' 
/usr/lib/gcc-lib/i586-linux/2.95.4/../../../../include/g++-3/std/bastring.h:152: undefined reference to `QApplication::exec(void)' 
/usr/lib/gcc-lib/i586-linux/2.95.4/../../../../include/g++-3/std/bastring.h:152: undefined reference to `QApplication::~QApplication(void)' 
/usr/lib/gcc-lib/i586-linux/2.95.4/../../../../include/g++-3/std/bastring.h:152: undefined reference to `QApplication::~QApplication(void)' 
collect2: ld returned 1 exit status 

何を私に教えてください。逃した

+0

Qtのバージョンが古くなっているのは興味深いと思います。まあ、それは私の選択ではありません。私の仕事で私は私の国の特別な支配団体によって承認されたので、このQtだけを使うことができました。 – FunnyHorse

答えて

1

あなたのGCCコンパイラは、バージョン2.95(以前の世紀からあまりにも古いバージョンであり、 /usr/lib/gcc-lib/i586-linux/2.95.4/が使用されているため、C++ 11標準に準拠しておらず、かなりバグがあることが知られていました)。 g++ -vまたはg++ --versionを実行してコンパイラのバージョンを確認してください。 (PATHの問題があるか、ビルドツールを誤ってインストールした可能性があります)。

あなたは

ところで、私はまた、あなたのQtライブラリをアップグレードすることをお勧めします(2017年7月に少なくともGCC 6、好ましくGCC 7)いくつかの多くのコンパイラを新しいバージョンにアップグレードする必要があります。現在のバージョン(2017年7月)はQt5.9であり、Qt5を使用する必要があります。

次に、あなたは、あなたが(おそらくあなたのMakefile中)Qtアプリケーションをコンパイルする助けるためにpkg-configを使用することができanswered by ilbeldus

お知らせとして、QTでより多くを追加し、あなたのメイクファイルを再生成する必要があります。それでもなお、mocを明示的に使用する必要があります。たとえば、Qt C++ GUIファイルfoo.ccmocを使用した後)を、

g++ -Wall -g -c $(pkg-config --cflags Qt5Gui) foo.c 

リンクオプションには$(pkg-config --libs Qt5Gui)を使用します。

私は古いMCBCのものを使ってはいけません(私はそれが何かを見つけられませんでした)。

+0

実際にQtバージョンでさえ古く、彼らは一緒に大丈夫で動作するはずです – IlBeldus

+1

@IelBeldusいいえ、それは古代ではありません。 Gcc 2.95は、これまでの世紀の文字通りのものです。Qt 4.6では、標準のC++クラスサポートを使用したい場合は、少なくとも4.xコンパイラ4.7が必要です。コンパイルしていないだけでなく、他にもいくつかの問題やUBがあるかもしれません。2.6カーネル(コンパイラのバージョンに基づいています)はまったくサポートされていません。以前のFreeBSDをベースにした独自の(そして非常に古いスタイルの)カーネルを持っていたLynxOS 4が、もっと新しいもので使用されているのを見たときだけでした。それは2005年です。あなたがそのツールチェーンを使用する必要があるなら、あなたはQt 3.5にロールバックする必要があります – Swift

+0

gccの間違ったバージョンに気づいてくれてありがとう!それは本当に役に立ちました。 – FunnyHorse

1

.proファイルにQT変数の設定がありません。

それにQT += core guiを追加し、再実行qmakeは、ここでのドキュメントを参照してください

を再コンパイルしよう:http://doc.qt.io/qt-4.8/qmake-variable-reference.html#qt

+1

P.なぜあなたはQt 4.6を使用していますか?実際にQt5に切り替えることができない場合、少なくとも4.8を使用してください – IlBeldus

+0

私が間違っていても正しいですが、このモジュールはデフォルトで追加されていませんか? – FunnyHorse

関連する問題