在hisiv300上QT5.5.1交叉編譯過程(帶webkit)

由於hisiv300不支持c++11,無法編譯webengine,故只好選擇編譯webkit。編譯webkit依賴pkg-config、libudev、fontconfig、openssl和icu,參考博文《在hisi上QT交叉編譯過程(帶webengine)》[1]。
a) 開啓pkg-config
a) 首先保證Ubuntu虛擬機安裝了pkg-config(我的機器安裝的是pkg-config-0.29)
b) 設置路徑/etc/profile文件添加:
export PKG_CONFIG_LIBDIR="/usr/lib/pkgconfig"
c) 設置pkg-config根目錄
在對Qt源代碼進行configure之前,輸入命令行PKG_CONFIG_SYSROOT_DIR=/進行根目錄設置
b) 編譯libudev
在https://github.com/gentoo/eudev/tree/rule_generator_eudev3下載eudev-rule_generator_eudev3.zip解壓,Ubuntu需要安裝gperf,否則編譯不過:
sudo apt-get install gperf
在eudev源代碼根目錄輸入:
i. ./autogen.sh
ii. ./configure --prefix=/home/crystal/qt_deplib/eudev --host=arm-hisiv300-linux CC=arm-hisiv300-linux-gcc CXX=arm-hisiv300-linux-g++ --disable-blkid --disable-kmod
iii. make
Make時出錯:program_invocation_short_name
參考《關於c語言中的program_invocation_short_name》博文[2]將用到 program_invocation_short_name 這個變量的地方全部用執行的字符串代替,比如,在編譯eudev時,直接用"udev"替換 program_invocation_short_name 這個變量。然後重新make。
i) make
ii) makeinstall
iii) sudo cp /home/crystal/qt_deplib/eudev/include/* /opt/hisi-linux/x86-arm/arm-hisiv300-linux/target/usr/include/
iv) sudo cp /home/crystal/qt_deplib/eudev/lib/* /opt/hisi-linux/x86-arm/arm-hisiv300-linux/target/usr/lib/

c) 編譯fontconfig
編譯fontconfig依賴free-type和expat,下面分別交叉編譯這三個庫。
i. 編譯free-type
下載
./configure --enable-static=yes --host=arm-hisiv300-linux --prefix=/home/crystal/qt_deplib/fontconig CC=arm-hisiv300-linux-gcc CXX=arm-hisiv300-linux-g++ --without-zlib
make
make install
導出pkg-config
vi $HOME/.profile or /etc/profile文件添加:
export PKG_CONFIG_LIBDIR="/usr/lib/pkgconfig:/home/he_liangbin/qt_deplib/fontconig/lib/pkgconfig"
sudo cp /home/crystal/qt_deplib/fontconig/include/freetype2/* /opt/hisi-linux/x86-arm/arm-hisiv300-linux/target/usr/include/ -rf

sudo cp /home/crystal/qt_deplib/fontconig/lib/libfreetype.* /opt/hisi-linux/x86-arm/arm-hisiv300-linux/target/usr/lib/
ii. 編譯expat
下載源代碼expat-2.2.6.tar.bz2解壓
./configure --prefix=/home/crystal/qt_deplib/expat --host=arm-hisiv300-linux CC=arm-hisiv300-linux-gcc CXX=arm-hisiv300-linux-g++ --enable-static
make
make install
sudo cp /home/crystal/qt_deplib/expat/include/* /opt/hisi-linux/x86-arm/arm-hisiv300-linux/target/usr/include/

sudo cp /home/crystal/qt_deplib/expat/lib/* /opt/hisi-linux/x86-arm/arm-hisiv300-linux/target/usr/lib/
iii. 編譯libdbus(此庫是否需要不確定,以下是編譯方法)
下載源代碼dbus-1.10.26.tar.gz解壓
./configure --prefix=/home/crystal/qt_deplib/expat --host=arm-hisiv300-linux CC=arm-hisiv300-linux-gcc CXX=arm-hisiv300-linux-g++ --enable-static
make
make install
sudo cp /home/crystal/qt_deplib/expat/include/* /opt/hisi-linux/x86-arm/arm-hisiv300-linux/target/usr/include/

sudo cp /home/crystal/qt_deplib/expat/lib/* /opt/hisi-linux/x86-arm/arm-hisiv300-linux/target/usr/lib/
iv. 編譯libxml2(此庫是否需要不確定,以下是編譯方法)
./configure --host=arm-hisiv300-linux --prefix=/home/crystal/qt_deplib/libxml2 --enable-static=yes CC=arm-hisiv300-linux-gcc CXX=arm-hisiv300-linux-g++ --with-python=no --with-zlib=no --with-lzma=no
make

make install
sudo cp /home/crystal/qt_deplib/libxml2/include/libxml2 /opt/hisi-linux/x86-arm/arm-hisiv300-linux/target/usr/include/ -rf
sudo cp /home/crystal/qt_deplib/libxml2/lib/* /opt/hisi-linux/x86-arm/arm-hisiv300-linux/target/usr/lib/
v. 編譯fontconfig
下載fontconfig-2.8.0.tar.gz,解壓,編譯。
./configure --enable-static=yes --enable-shared=no --host=arm-hisiv300-linux --prefix=/home/crystal/qt_deplib/fontconig CC=arm-hisiv300-linux-gcc CXX=arm-hisiv300-linux-g++ --without-png
make
make install
sudo cp /home/crystal/qt_deplib/fontconig/include/fontconfig /opt/hisi-linux/x86-arm/arm-hisiv300-linux/target/usr/include/ -rf
sudo
cp /home/crystal/qt_deplib/fontconig/include/freetype2/* /opt/hisi-linux/x86-arm/arm-hisiv300-linux/target/usr/include/ -rf

sudo cp /home/crystal/qt_deplib/fontconig/lib/* /opt/hisi-linux/x86-arm/arm-hisiv300-linux/target/usr/lib/
d) 編譯openssl
下載安裝包openssl-1.0.2l.tar.gz解壓
./config linux-generic32 no-asm static no-async --prefix=/home/crystal/qt_deplib/openssl --openssldir=/home/crtstal/qt_deplib/openssl CROSS_COMPILE= arm-hisiv300-linux- CC=arm-hisiv300-linux-gcc CXX=arm-hisiv300-linux-g++
修改Makefile:
CROSS_COMPILE= arm-hisiv300-linux-
CC= cc to CC= $(CROSS_COMPILE)gcc
AR= ar $(ARFLAGS) r to AR= $(CROSS_COMPILE)ar $(ARFLAGS) r
RANLIB= /usr/bin/ranlib to RANLIB= $(CROSS_COMPILE)ranlib
搜索刪除 -m64
make
make install
拷貝頭文件和庫文件到交叉編譯安裝目錄target/user下面:
sudo cp /home/crystal/qt_deplib/openssl/include/* /opt/hisi-linux/x86-arm/arm-hisiv300-linux/target/usr/include/ -rf
sudo cp /home/crystal/qt_deplib/openssl/lib/.a /opt/hisi-linux/x86-arm/arm-hisiv300-linux/target/usr/lib/
e) 編譯icu
一開始下載icu4c-59_2-src.tgz,解壓編譯怎麼都通不過,因爲arm-hisiv300不支持c++11,後面經過多次嘗試,下載icu4c-51_2-src.tgz解壓編譯通過。編譯過程如下:
mkdir icupc
cd ./icupc
…/icu/source/runConfigureICU Linux/gcc
make
cd …/icu/source
./configure --enable-static=yes --enable-shared=no --host=arm-hisiv300-linux --disable-samples --disable-tests --prefix=/home/crystal/qt_deplib/icu CC=arm-hisiv300-linux-gcc CXX=arm-hisiv300-linux-g++ --with-cross-build=/home/crystal/icupc
make
make install
sudo cp /home/crystal/qt_deplib/icu/include/
/opt/hisi-linux/x86-arm/arm-hisiv300-linux/target/usr/include/ -rf
sudo cp /home/crystal/qt_deplib/icu/lib/* /opt/hisi-linux/x86-arm/arm-hisiv300-linux/target/usr/lib/

f) 編譯Qt
進入Qt5.5.1源代碼根目錄,執行下面命令:
PKG_CONFIG_SYSROOT_DIR=/ ./configure -v -prefix /opt/qt5.5.1-v300-static -static -opensource -release -confirm-license -make libs -xplatform linux-arm-gnueabi-g++ -optimized-qmake -widgets -gui -accessibility -pch -alsa -linuxfb -fontconfig -mtdev -evdev -openssl -icu -strip -qt-sql-sqlite -qt-libjpeg -qt-libpng -qt-zlib -qt-freetype -pkg-config -no-tslib -no-rpath -no-journald -no-c++11 -no-glib -no-directfb -no-xcb -no-sse2 -no-openssl -no-nis -no-cups -no-kms -no-opengl -no-largefile -no-pulseaudio -no-qml-debug -no-xfixes -no-xrandr -no-xrender -no-separate-debug-info -no-compile-examples -nomake examples -nomake tools -nomake tests
然後make,編譯到webkit裏的JavaScriptCore時,報錯:runtime/JSCJSValue.h:101:1: error: ‘JS_EXPORT_PRIVATE’ does not name a type
不能識別JS_EXPORT_PRIVATE和JS_EXPORTDATA。在不能識別的頭文件裏,加入下列宏定義:
#ifndef JS_EXPORT_PRIVATE
#define JS_EXPORT_PRIVATE WTF_IMPORT
#endif
#ifndef JS_EXPORTDATA
#define JS_EXPORTDATA JS_EXPORT_PRIVATE
#endif
所有需要添加的頭文件列舉如下:
qt-everywhere-opensource-src-5.5.1/qtwebkit/Source/JavaScriptCore/runtime/JSCJSValue.h
qt-everywhere-opensource-src-5.5.1/qtwebkit/Source/JavaScriptCore/yarr/YarrPattern.h
qt-everywhere-opensource-src-5.5.1/qtwebkit/Source/JavaScriptCore/runtime/JSExportMacros.h
qt-everywhere-opensource-src-5.5.1/qtwebkit/Source/JavaScriptCore/heap/Weak.h
qt-everywhere-opensource-src-5.5.1/qtwebkit/Source/JavaScriptCore/API/JSStringRef.h
qt-everywhere-opensource-src-5.5.1/qtwebkit/Source/JavaScriptCore/API/OpaqueJSString.h
qt-everywhere-opensource-src-5.5.1/qtwebkit/Source/JavaScriptCore/parser/SourceCode.h
qt-everywhere-opensource-src-5.5.1/qtwebkit/Source/JavaScriptCore/parser/SourceProvider.h
qt-everywhere-opensource-src-5.5.1/qtwebkit/Source/JavaScriptCore/bytecode/Watchpoint.h
qt-everywhere-opensource-src-5.5.1/qtwebkit/Source/JavaScriptCore/heap/MarkStack.h
qt-everywhere-opensource-src-5.5.1/qtwebkit/Source/JavaScriptCore/heap/MachineStackMarker.h
qt-everywhere-opensource-src-5.5.1/qtwebkit/Source/JavaScriptCore/heap/VTableSpectrum.h
qt-everywhere-opensource-src-5.5.1/qtwebkit/Source/JavaScriptCore/heap/WriteBarrierSupport.h
qt-everywhere-opensource-src-5.5.1/qtwebkit/Source/JavaScriptCore/runtime/SamplingCounter.h
qt-everywhere-opensource-src-5.5.1/qtwebkit/Source/JavaScriptCore/debugger/Debugger.h
qt-everywhere-opensource-src-5.5.1/qtwebkit/Source/JavaScriptCore/parser/SourceProviderCache.h
qt-everywhere-opensource-src-5.5.1/qtwebkit/Source/JavaScriptCore/profiler/Profile.h
qt-everywhere-opensource-src-5.5.1/qtwebkit/Source/JavaScriptCore/runtime/InitializeThreading.h
qt-everywhere-opensource-src-5.5.1/qtwebkit/Source/JavaScriptCore/runtime/JSLock.h

參考文獻
[1] 在hisi上QT交叉編譯過程(帶webengine)
https://blog.csdn.net/heliangbin87/article/details/82499522
[2] 關於c語言中的program_invocation_short_name
https://www.cnblogs.com/vanwoos/p/6684170.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章