HOST:ubuntu 12.04LTS, 64bit, Core i7-4790K,gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)
CROSS-TOOLCHAIN:gcc version 4.4.1 (Sourcery G++ Lite 2009q3-67)
SRC:
tslib-1.4.tar.gz
qt-everywhere-opensource-src-5.6.1.tar.gz
qt-opensource-linux-x64-5.6.1.run
1 编译linux_atomic库,(undefined reference to `__sync_sub_and_fetch_4‘ ),高版本的交叉编译工具可以无视;
参考[http://blog.csdn.net/wangmingape/article/details/24545775]。
首先下载gcc 4.6.0源码,在gcc-4.6.0/gcc/config/arm目录下可以找到linux-atomic.c文件。
将这个文件复制到你的工作目录,最好新建一个文件夹,并添加build.bash脚本
libtool --tag=CC --mode=compile arm-linux-gcc -g -O2 -MT linux-atomic.lo -MD -MP -MF linux-atomic.Tpo -c -o linux-atomic.lo linux-atomic.c libtool --tag=CC --mode=link arm-linux-g++ -g -O2 -o liblinux-atomic.la linux-atomic.lo
执行后就在你的当前目录在生成.libs文件夹,(tree -a )
├── build.bash ├── liblinux-atomic.la ├── .libs │ ├── liblinux-atomic.a │ ├── liblinux-atomic.la -> ../liblinux-atomic.la │ └── linux-atomic.o ├── linux-atomic.c ├── linux-atomic.lo ├── linux-atomic.o └── linux-atomic.Tpo
这个文件夹中文件复制到你的库目录,最好新建文件夹,如 /opt/linux-atomic
liblinux-atomic.a liblinux-atomic.la linux-atomic.o
2 接下来我们开始编译qt,先将qt-everywhere-opensource-src-5.6.1.tar.gz 解压到你的工作目录。
1)编辑qmake.conf,文件位置在qt-everywhere-opensource-src-5.6.1\qtbase\mkspecs\linux-arm-gnueabi-g++。
在这个文件里,主要是配置交叉编译工具,tslib的库也需要在这里配置。我的配置如下,红色的是修改的部分:
# # qmake configuration for building with arm-linux-gnueabi-g++ # MAKEFILE_GENERATOR = UNIX CONFIG += incremental QMAKE_INCREMENTAL_STYLE = sublib #S3C6410 QT_QPA_DEFAULT_PLATFORM = linuxfb QMAKE_CFLAGS_RELEASE +=-O2 -march=armv5te QMAKE_CXXFLAGS_RELEASE +=-O2 -march=armv5te QMAKE_INCDIR += /opt/tslib/include QMAKE_LIBDIR += /opt/tslib/lib include(../common/linux.conf) include(../common/gcc-base-unix.conf) include(../common/g++-unix.conf) # modifications to g++.conf QMAKE_CC = arm-linux-gcc -lts QMAKE_CXX = arm-linux-g++ -lts QMAKE_LINK = arm-linux-g++ -lts QMAKE_LINK_SHLIB = arm-linux-g++ -lts # modifications to linux.conf QMAKE_AR = arm-linux-ar cqs QMAKE_OBJCOPY = arm-linux-objcopy QMAKE_NM = arm-linux-nm -P QMAKE_STRIP = arm-linux-strip load(qt_config)
2)在qt-everywhere-opensource-src-5.6.1目录下创建编译脚本,具体如下:
./configure -prefix /opt/qt_arm -opensource -confirm-license -release -shared -static -xplatform linux-arm-gnueabi-g++ -optimized-qmake -pch -qt-sql-sqlite -qt-libjpeg -qt-zlib -qt-libpng -qt-freetype -tslib -no-opengl -no-sse2 -no-openssl -no-nis -no-cups -no-glib -no-dbus -no-xcb -no-eglfs -no-xcursor -no-xfixes -no-xrandr -no-xrender -no-separate-debug-info -no-iconv -make libs -make examples -nomake tools -nomake tests -skip qt3d -skip qtcanvas3d -skip qtdoc -skip qtwayland -I/opt/tslib/include -L/opt/tslib/lib -v -llinux-atomic -L/opt/linux-atomic
红色标记出比较重要的地方:
-prefix :将来库安装目录
-xplatform:说明使用的conf文件位置,即)mkspecs\linux-arm-gnueabi-g++\qmake.conf)
-I/opt/tslib/include -L/opt/tslib/lib:将tslib库加进来
-llinux-atomic -L/opt/linux-atomic:将atomic库加进来
3)执行脚本,为下一步的编译做好准备活动,我的环境信息输出如下:
Building on: linux-g++ (unknown, CPU features: none detected) Building for: linux-arm-gnueabi-g++ (arm, CPU features: none detected) Platform notes: - Also available for Linux: linux-clang linux-kcc linux-icc linux-cxx qmake vars .......... styles += mac fusion windows DEFINES += QT_NO_MTDEV DEFINES += QT_NO_LIBUDEV DEFINES += QT_NO_LIBINPUT EXTRA_INCLUDEPATH += "/opt/tslib/include" EXTRA_LIBS += -L"/opt/tslib/lib" -l"linux-atomic" -L"/opt/linux-atomic" sql-drivers = sqlite sql-plugins = qmake switches ......... Build options: Configuration .......... accessibility audio-backend c++11 clock-gettime clock-monotonic compile_examples concurrent cross_compile enable_new_dtags evdev eventfd freetype full-config getaddrinfo getifaddrs gif harfbuzz inotify ipv6ifname jpeg large-config largefile linuxfb medium-config minimal-config mremap no-pkg-config pcre png posix_fallocate precompile_header qpa qpa reduce_exports release release_tools rpath small-config static threadsafe-cloexec tslib zlib Build parts ............ libs examples Mode ................... release; optimized tools Using sanitizer(s)...... none Using C++ standard ..... c++11 Using gold linker....... no Using new DTAGS ........ yes Using PCH .............. yes Using LTCG ............. no Target compiler supports: Neon ................. no Qt modules and options: Qt D-Bus ............... no Qt Concurrent .......... yes Qt GUI ................. yes Qt Widgets ............. yes Large File ............. yes QML debugging .......... yes Use system proxies ..... no Support enabled for: Accessibility .......... yes ALSA ................... no CUPS ................... no Evdev .................. yes FontConfig ............. no FreeType ............... qt Glib ................... no GStreamer .............. no GTK theme .............. no HarfBuzz ............... yes (bundled copy) Iconv .................. no ICU .................... no Image formats: GIF .................. yes (in QtGui, using bundled copy) JPEG ................. yes (in QtGui, using bundled copy) PNG .................. yes (in QtGui, using bundled copy) libinput................ no Logging backends: journald ............... no syslog ............... no mtdev .................. no Networking: getaddrinfo .......... yes getifaddrs ........... yes IPv6 ifname .......... yes libproxy.............. no OpenSSL .............. no NIS .................... no OpenGL / OpenVG: EGL .................. no OpenGL ............... no OpenVG ............... no PCRE ................... yes (bundled copy) pkg-config ............. no PulseAudio ............. no QPA backends: DirectFB ............. no EGLFS ................ no EGLFS i.MX6 ........ no EGLFS i.MX6 Wayland. no EGLFS EGLDevice .... no EGLFS GBM .......... no EGLFS Mali ......... no EGLFS Raspberry Pi . no EGLFS X11 .......... no LinuxFB .............. yes Mir client............ no XCB .................. no Session management ..... yes SQL drivers: DB2 .................. no InterBase ............ no MySQL ................ no OCI .................. no ODBC ................. no PostgreSQL ........... no SQLite 2 ............. no SQLite ............... qt-qt TDS .................. no tslib .................. yes udev ................... no xkbcommon-x11........... no xkbcommon-evdev......... no zlib ................... yes (bundled copy) WARNING: Using static linking will disable the use of dynamically loaded plugins. Make sure to import all needed static plugins, or compile needed modules into the library. NOTE: Qt is using double for qreal on this system. This is binary incompatible against Qt 5.1. Configure with ‘-qreal float‘ to create a build that is binary compatible with 5.1. NOTE: -optimized-tools is not useful in -release mode. Qt is now configured for building. Just run ‘make‘. Once everything is built, you must run ‘make install‘. Qt will be installed into /opt/qt_arm Prior to reconfiguration, make sure you remove any leftovers from the previous build.
4)编译。qt非常大,需要编译比较长的时间,多核的同学注意使用make -jX命令,X是你CPU的核心数,这样可以加快编译速度。
make -j8 && sudo make -j8 install
5)配置环境变量。这样/opt/qt_arm目录就有了你需要的库了,将库原封不动的搬到开发板,基本上就大功告成了。
在开发板上建立环境变量:
export QTDIR=/opt/qt_arm export QT_QPA_FONTDIR=$QTDIR/lib/fonts export QT_QPA_PLATFORM_PLUGIN_PATH=$QTDIR/plugins/ export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH export QT_QPA_PLATFORM=linuxfb:fb=/dev/fb0:size=800x600:mmSize=800x600:offset=0x0:tty=/dev/tty1 export QT_QPA_GENERIC_PLUGINS=tslib:/dev/input/event1
在开发板的/opt/qt_arm/examples路径下有一些示例可以直接拿来测试。
PS: make clean && make distclean总是失败的,重新编译的也会报错,还没有搞清楚哪里的问题。