сборка приложения Qt вне исходного дерева Qt - PullRequest
2 голосов
/ 15 июня 2011

Я создал простое приложение 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.

Ответы [ 2 ]

0 голосов
/ 15 июня 2011

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

Я полагаю, что "трюк" выполняется с определенным файлом .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.)

0 голосов
/ 15 июня 2011

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

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

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

...