与詹金斯合作

时间:2016-08-18 12:13:18

标签: c++ git qt jenkins

我试图让Jenkins在我提交Git时为我编译和构建。我有一个在Qt Creator中创建的helloworld应用程序。它确实在Qt Creator中编译和构建,它确实显示在我的手机上,但它并不想用Jenkins编译和构建。

我正在使用QtC使用的相同shell命令:

qmake helloworld.pro -r -spec android-g++;
make;

控制台输出为:

+ qmake helloworld.pro -r -spec android-g++
+ make
/home/ndk/toolchains/arm-linux-androideabi-4.9-/prebuilt/bin/arm-linux-androideabi-g++ -c -pipe -std=c++11 -O2 -Os -fomit-frame-pointer -fno-strict-aliasing -finline-limit=64 -mthumb -Wall -Wno-psabi -W  -I/usr/share/qt4/mkspecs/android-g++ -I. -I. -I/home/ndk/sources/cxx-stl/gnu-libstdc++//include -I/home/ndk/sources/cxx-stl/gnu-libstdc++//libs//include -I/home/ndk/platforms//arch-arm//usr/include -o main.o main.cpp
In file included from main.cpp:1:0:
mainwindow.h:4:23: fatal error: QMainWindow: No such file or directory
 #include <QMainWindow>
                       ^
compilation terminated.
Makefile:187: recipe for target 'main.o' failed
make: *** [main.o] Error 1

我的helloworld.pro:

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = helloworld
TEMPLATE = app


SOURCES += main.cpp\
        mainwindow.cpp

HEADERS  += mainwindow.h

FORMS    += mainwindow.ui

CONFIG += mobility
MOBILITY = 

的main.cpp

#include "mainwindow.h"
#include <QMainWindow>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

修改/更新:

到目前为止,我已经尝试指定qmake的完整路径,以确保我使用Qt的qmake。

/home/qt/5.7/android_armv7/bin/qmake helloworld.pro -r -spec android-g++;
make;

输出结果为:

/home/qt/5.7/android_armv7/bin/uic mainwindow.ui -o ui_mainwindow.h
/home/ndk/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-g++ -c -Wno-psabi -march=armv7-a -mfloat-abi=softfp -mfpu=vfp -ffunction-sections -funwind-tables -fstack-protector -fno-short-enums -DANDROID -Wa,--noexecstack -fno-builtin-memmove -std=c++11 -O2 -Os -fomit-frame-pointer -fno-strict-aliasing -finline-limit=64 -mthumb -Wall -Wno-psabi -W -D_REENTRANT -fPIC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I. -I../../qt/5.7/android_armv7/include -I../../qt/5.7/android_armv7/include/QtWidgets -I../../qt/5.7/android_armv7/include/QtGui -I../../qt/5.7/android_armv7/include/QtCore -I. -I. -I../../ndk/sources/cxx-stl/gnu-libstdc++/4.9/include -I../../ndk/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi-v7a/include -I../../ndk/platforms/android-9/arch-arm/usr/include -I../../qt/5.7/android_armv7/mkspecs/android-g++ -o main.o main.cpp
/home/ndk/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-g++ -c -Wno-psabi -march=armv7-a -mfloat-abi=softfp -mfpu=vfp -ffunction-sections -funwind-tables -fstack-protector -fno-short-enums -DANDROID -Wa,--noexecstack -fno-builtin-memmove -std=c++11 -O2 -Os -fomit-frame-pointer -fno-strict-aliasing -finline-limit=64 -mthumb -Wall -Wno-psabi -W -D_REENTRANT -fPIC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I. -I../../qt/5.7/android_armv7/include -I../../qt/5.7/android_armv7/include/QtWidgets -I../../qt/5.7/android_armv7/include/QtGui -I../../qt/5.7/android_armv7/include/QtCore -I. -I. -I../../ndk/sources/cxx-stl/gnu-libstdc++/4.9/include -I../../ndk/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi-v7a/include -I../../ndk/platforms/android-9/arch-arm/usr/include -I../../qt/5.7/android_armv7/mkspecs/android-g++ -o mainwindow.o mainwindow.cpp
mainwindow.cpp:3:25: fatal error: QtGui/QAction: No such file or directory
 #include <QtGui/QAction>
                         ^
compilation terminated.
Makefile:1780: recipe for target 'mainwindow.o' failed
make: *** [mainwindow.o] Error 1

2 个答案:

答案 0 :(得分:2)

您的jenkins设置很可能使用了错误的qmake。 Qt安装与其qmake之间存在1:1映射。所以,你安装Qt for android将有自己的qmake,你必须通过完整路径引用! Qt Creator设置路径以便自动发生这种情况,Jenkins没有 - 而且无论如何都不应该这样。

在为任何特定的Qt版本构建时,您只需要显式调用其qmake。从那时起,只要正确的编译器在路径中,就会发生事情,并且您不需要再次手动引用该Qt版本。 make文件都将引用Qt安装中的Qt库,头文件和工具。

您也不需要-spec参数。每个Qt安装都是针对特定的mkspec编译的,因此qmake本身确切地知道规范是什么。我不知道为什么QtCreator给出了这个论点,它没有多大意义。

答案 1 :(得分:0)

命令行中唯一的Qt标头路径是mkspec的路径。我会责怪服务器的Qt安装。

确保在服务器上正确安装了Qt for Android,并且它是您正在呼叫的qmake