создание приложения Qt вне исходного дерева Qt

Я создал простое приложение Qt, основанное на примере приложения Qt и отлично собирающееся из каталога "examples" дерева исходных текстов Qt.

Теперь я хочу переместить файлы проекта в другое место, но qmake не может создать Makefile, который может найти файлы заголовков Qt.

Файлы проекта перемещены с ~/qt-everywhere-opensource-src-4.7.2/examples/webkit/fullscreenbrowser на ~/cvswork/fullscreenbrowser/

Итак, файл .pro теперь ~/cvswork/fullscreenbrowser/fullscreenbrowser.pro

И исходники Qt все еще на ~/qt-everywhere-opensource-src-4.7.2

qmake сам по себе работает нормально, но make не может загрузить некоторые из них:

$ make
g++ -c -pipe -O2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_WEBKIT_LIB 
-DQT_GUI_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB 
-I/usr/share/qt4/mkspecs/linux-g++ 
-I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtNetwork 
-I/usr/include/qt4/QtGui 
-I/usr/include/qt4/QtWebKit 
-I/usr/include/qt4 
-I. 
-o main.o main.cpp
main.cpp:41:17: error: QtGui: No such file or directory

Для сравнения, при сборке в каталоге ... examples ... первый вызов g++ сильно отличается:

$ make
g++ -c -pipe -fno-exceptions -O2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG 
-DQT_WEBKIT_LIB -DQT_GUI_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -DQT_HAVE_MMX 
-DQT_HAVE_3DNOW -DQT_HAVE_SSE -DQT_HAVE_MMXEXT -DQT_HAVE_SSE2 -DQT_HAVE_SSE3 
-DQT_HAVE_SSSE3 -DQT_HAVE_SSE4_1 -DQT_HAVE_SSE4_2 -DQT_HAVE_AVX -DQT_SHARED 
-I../../../mkspecs/qws/linux-x86-g++ 
-I. 
-I../../../include/QtCore 
-I../../../include/QtNetwork 
-I../../../include/QtGui 
-I../../../include/QtWebKit 
-I../../../include 
-I.moc/release-shared-emb-x86 
-o .obj/release-shared-emb-x86/main.o main.cpp

Что мне нужно настроить, чтобы найти исходный каталог Qt?


РЕДАКТИРОВАТЬ: файл fullscreenbrowser.pro можно увидеть здесь: http://pastebin.com/jUPJiWBC

EDIT2: я получаю такое же поведение в каталоге примеров при добавлении -nocache к вызову qmake.


person Udo G    schedule 15.06.2011    source источник


Ответы (2)


На самом деле, я думаю, это более или менее по замыслу. Построение внутри исходной папки должно немного отличаться от построения на основе установленного дерева, например, просто для того, чтобы иметь возможность разумно выполнять обновления (предварительно соберите все на месте, не ссылаясь на какую-либо существующую сборку).

Я считаю, что «трюк» выполняется с помощью определенного .qmake.cache файла в исходной папке верхнего уровня (~/qt-everywhere-opensource-src-4.7.2 в вашем случае), который создается, когда вы настраиваете дерево исходных текстов (которое, оказывается, создает там qmake).

Попробуйте скопировать этот файл в новое место сборки (~/cvswork/fullscreenbrowser/ или ~/cvswork, если у вас есть другие проекты, он тоже должен искать там) и повторно запустите qmake (убедитесь, что вы используете тот, который находится внутри исходного каталога Qt).

Это должно работать, если вы просто настроили исходное дерево.

Вот первые строки этого .qmake.cache файла на моей машине после распаковки и настройки старого архива Qt:

CONFIG +=  release shared dll largefile stl precompile_header mmx 3dnow sse sse2 sse3 ssse3 sse4_1 sse4_2 avx dylib create_prl link_prl depend_includepath fix_output_dirs QTDIR_build
QT_SOURCE_TREE = $$quote(/home/foo/src/qt-everywhere-opensource-src-4.7.3)
QT_BUILD_TREE = $$quote(/home/foo/src/qt-everywhere-opensource-src-4.7.3)
QT_BUILD_PARTS = libs tools examples demos docs translations
QMAKE_ABSOLUTE_SOURCE_ROOT = $$QT_SOURCE_TREE
QMAKE_MOC_SRC    = $$QT_BUILD_TREE/src/moc

#local paths that cannot be queried from the QT_INSTALL_* properties while building QTDIR
QMAKE_MOC        = $$QT_BUILD_TREE/bin/moc
QMAKE_UIC        = $$QT_BUILD_TREE/bin/uic
QMAKE_UIC3       = $$QT_BUILD_TREE/bin/uic3
QMAKE_RCC        = $$QT_BUILD_TREE/bin/rcc
QMAKE_QDBUSXML2CPP = $$QT_BUILD_TREE/bin/qdbusxml2cpp
QMAKE_INCDIR_QT  = $$QT_BUILD_TREE/include
QMAKE_LIBDIR_QT  = $$QT_BUILD_TREE/lib

QMAKE_LFLAGS    = -Wl,-rpath-link,$$QT_BUILD_TREE/lib $$QMAKE_LFLAGS
QT_CFLAGS_PSQL   = -I/usr/include/postgresql-8.4
QT_LFLAGS_PSQL   = -L/usr/lib64/postgresql-8.4/lib64
QT_CFLAGS_MYSQL   = -I/usr/include/mysql
QT_LFLAGS_MYSQL   = -Wl,-O1 -Wl,--as-needed -rdynamic -L/usr/lib64/mysql -lmysqlclient_r -L/usr//lib64 -lz -lpthread -lcrypt -lnsl -lm -lpthread -L/usr/lib64/ -lssl -lcrypto
Q    T_LFLAGS_ODBC   = -lodbc
QMAKESPEC = $$QT_BUILD_TREE/mkspecs/linux-g++-64
...

Как видите, многие фундаментальные переменные qmake переопределяются этим префиксом дерева построения.

(Не уверен, почему вы просто не устанавливаете Qt где-нибудь в своем домашнем каталоге. У вас не будет этой боли, и вам не понадобится root для этого, я думаю, пока префикс ваш собственный - не пробовал это уже много лет, так что YMMV.)

person Mat    schedule 15.06.2011
comment
Спасибо. Простое создание символьной ссылки на файл .qmake.cache помогло. Кстати, у меня в домашнем каталоге установлен Qt, но я не хочу устанавливать его в рабочий каталог CVS. Кроме того, я хочу хранить все мои проекты CVS в одном месте (cvswork). - person Udo G; 16.06.2011

Пример, вероятно, пытается включить файл из другого места в иерархии. В простых случаях вы можете создать новый файл проекта следующим образом:

qmake -project # generate a project file using defaults
qmake          # generate a makefile from the project file
make           # build using the makefile

qmake будет проходить через ваш каталог рекурсивно, исследуя и включая файлы. Он недостаточно умен, чтобы разобраться во всем, как и каждый модуль, который может вам понадобиться, но он хорошо справляется с простыми тестовыми проектами. Обычно я делаю то же самое для всех своих спайков.

person Kaleb Pederson    schedule 15.06.2011
comment
Извините, я забыл добавить свой файл .pro к вопросу. Вот оно: pastebin.com/jUPJiWBC Мое предположение заключается в том, что qmake успешно находит и использует webkit.pro файл в родительском каталоге, но в противном случае не жалуется, когда такой файл не существует ни в одном родительском каталоге (последнее имеет место при попытке сборки вне каталога Qt), что означает, что он просто в этом случае игнорирует строку QT+=. - person Udo G; 15.06.2011