b2c信息网

您现在的位置是:首页 > 今日新闻 > 正文

今日新闻

qt源码编译xcb(qt源码编译arm版)

hacker2022-06-12 17:18:22今日新闻35
本文目录一览:1、windows怎么编译qt源码64位

本文目录一览:

windows怎么编译qt源码64位

在Windows下,Qt官网默认提供的二进制版本大多是32位,只对VS2013提供了64位版本。我电脑上安装的VS2010 IDE,根据自己的需要编译特定的库和插件,需要编译Qt源码。 详细可以参考这个,有图解教程,希望可以帮到你

QT编译环境搭建步骤

我也曾有过你这个困惑。在linux里qt的开发环境有3种:嵌入式、qvfb和x11,编译qt源码可以得到这三种环境。编译qt源码有三个步骤:配置(configure)、编译(make)、安装(make install)。三种环境仅仅在配置时有区别,网上很容易搜到具体做法。

ubuntu怎么编译qt5源代码

以下是编译QT源码的基本步骤:

1.源代码的获取 , 最新的是4.8.2版本。

2.解压代码

输入指令: tar zxvf qt-everywhere-opensource-src-4.8.2.tar.gz,解压出QT源代码。

3.执行./config生成makefile

输入指令: ./config

下面会出现提示,是使用the Commercial Edition还是Open Source Edition。

选择”o”,接着会出现一些提示关于license的信息,选择”yes”。

4.编译QT

等在Ubuntu中顺利下载了缺失的那3个lib后。再次重复第三步的 ./configure指令。

输入指令: make,

然后便可以顺利地生成Makefile文件。

5.安装QT

运行指令: sudo make install,需要几分钟的时间,系统会默认将Qt安装到目录:/usr/local/Trolltech/Qt-4.8.2。

验证安装完成:运行/usr/local/Trolltech/Qt-4.8.2/bin/designer,如果能够正常启动designer,则说明Qt已经安装好了。

6.设置环境变量

7.测试环境变量

如何在Windows下构建ARM Linux QT开发环境

准备工作:

首先,最不可思议的,是要在Linux下把QT编译一遍,因为库都是一样的,需要的就是一些Windows下的qmake、moc、uic之类的工具而已。因为QT源码很多地方不能在Windows下面交叉编译通过,虽然我改了一些代码和配置(一会儿我贴出补丁来),但我只用它编译了qtbase、qtdeclarative这两个模块和qttools模块中的一部分。

Linux下的编译可以参照我之前写的这篇文章。参考配置:

开发包:

./configure -extprefix /opt/qt/5.2.1/arm -prefix /usr -plugindir /usr/lib/qt/plugins -importdir /usr/lib/qt/imports -qmldir /usr/lib/qt/qml -make libs -xplatform linux-arm-gnueabi-g++ -opengl es2 -confirm-license -opensource -xcb -xinput2 -nomake examples -nomake tests -qt-zlib -qt-xcb -dbus -largefile -cups -no-fontconfig -glib -gtkstyle -qt-freetype -sysroot /opt/sysroot-arm -mysql_config /opt/sysroot-arm/usr/bin/mysql_config -v

运行库:

./configure -prefix /usr -plugindir /usr/lib/qt/plugins -importdir /usr/lib/qt/imports -qmldir /usr/lib/qt/qml -make libs -xplatform linux-arm-gnueabi-g++ -opengl es2 -confirm-license -opensource -xcb -xinput2 -nomake examples -nomake tests -qt-zlib -qt-xcb -dbus -largefile -cups -no-fontconfig -glib -gtkstyle -qt-freetype -sysroot /opt/sysroot-arm -mysql_config /opt/sysroot-arm/usr/bin/mysql_config -v

做完这一步,你获得两样东西,sysroot和linux下的ARM QT开发文件。sysroot是编译QT之前,用Buildroot做的开发用根目录。这两个东西都要拷贝到Windows里,因为Windows不支持符号连接,拷贝需要需要去掉这些连接,这么做:

cp [源目录] [目标目录] -Lr

第二,需要一个Windows下模拟Linux环境的东西和编译器,我用的是MSYS和MinGW,因为他们编译出来的程序比Cygwin快。在这里可以找到:。

第三,需要Linaro ARM GCC编译器,Windows版本的。在这里可以找到:

第四,需要Python,Windows版本的。在这里可以找到:

下载、安装,然后在MSYS根目录的/etc/profile里面export PATH=$PATH:[Python安装目录]

第五,需要pkg-config,Windows版本的,这个比较麻烦,需要下载以下三个文件,并提取出我们需要的东西:

(提取pkg-config.exe)

(提取libglib-2.0-0.dll)

(提取intl.dll)

把他们都放到MSYS的bin目录下,然后给pkg-config.exe做一个脚本pkg-config,因为下载的pkg-config.exe比较蠢,在同时指定PKG_CONFIG_SYSROOT_DIR和PKG_CONFIG_LIBDIR这两个环境变量的时候,第一个cflags会输出两次PKG_CONFIG_SYSROOT_DIR。这么做这个脚本:

#!/bin/sh

pushd / /dev/null

ROOTDIR=`pwd -W 2/dev/null`

popd /dev/null

SYSROOT=$PKG_CONFIG_SYSROOT_DIR

pkg-config.exe "$@" | sed "s#$SYSROOT$SYSROOT#$SYSROOT#g" | sed "s#$ROOTDIR##g"

最后去掉$ROOTDIR前缀是为了和Linux Makefile兼容,同时也不会影响在make中的地址转换,最后,QT源码和我的补丁。

我的补丁如下:

diff -Naur qt-everywhere-opensource-src-5.2.1-old/qtbase/configure qt-everywhere-opensource-src-5.2.1/qtbase/configure

--- qt-everywhere-opensource-src-5.2.1-old/qtbase/configure 2014-02-02 04:37:23 +0800

+++ qt-everywhere-opensource-src-5.2.1/qtbase/configure 2014-08-27 22:34:47 +0800

@@ -4022,6 +4022,10 @@

done

(cd "$outpath/qmake"; "$MAKE") || exit 2

+ if [ -e "$outpath/bin/qmake.exe" ]; then

+ echo '#!/bin/sh' "$outpath/bin/qmake"

+ echo "$outpath/bin/qmake.exe" '"$@"' "-unix" "$outpath/bin/qmake"

+ fi

fi # Build qmake

echo "Running configuration tests..."

@@ -4091,9 +4095,9 @@

# when xcompiling, check environment to see if it's actually usable

if [ -z "$PKG_CONFIG_LIBDIR" ]; then

if [ -n "$CFG_SYSROOT" ] [ -d "$CFG_SYSROOT/usr/lib/pkgconfig" ]; then

- PKG_CONFIG_LIBDIR=$CFG_SYSROOT/usr/lib/pkgconfig:$CFG_SYSROOT/usr/share/pkgconfig

+ PKG_CONFIG_LIBDIR=$CFG_SYSROOT/usr/lib/pkgconfig\;$CFG_SYSROOT/usr/share/pkgconfig

if [ -n "$GCC_MACHINE_DUMP" ]; then

- PKG_CONFIG_LIBDIR=$PKG_CONFIG_LIBDIR:$CFG_SYSROOT/usr/lib/$GCC_MACHINE_DUMP/pkgconfig

+ PKG_CONFIG_LIBDIR=$PKG_CONFIG_LIBDIR\;$CFG_SYSROOT/usr/lib/$GCC_MACHINE_DUMP/pkgconfig

fi

export PKG_CONFIG_LIBDIR

echo 2 "Note: PKG_CONFIG_LIBDIR automatically set to $PKG_CONFIG_LIBDIR"

diff -Naur qt-everywhere-opensource-src-5.2.1-old/qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf qt-everywhere-opensource-src-5.2.1/qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf

--- qt-everywhere-opensource-src-5.2.1-old/qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf 2014-02-02 04:37:37 +0800

+++ qt-everywhere-opensource-src-5.2.1/qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf 2014-08-28 00:08:34 +0800

@@ -11,14 +11,21 @@

include(../common/g++-unix.conf)

# modifications to g++.conf

-QMAKE_CC = arm-linux-gnueabi-gcc

-QMAKE_CXX = arm-linux-gnueabi-g++

-QMAKE_LINK = arm-linux-gnueabi-g++

-QMAKE_LINK_SHLIB = arm-linux-gnueabi-g++

+QMAKE_CC = arm-linux-gnueabihf-gcc

+QMAKE_CXX = arm-linux-gnueabihf-g++

+QMAKE_LINK = arm-linux-gnueabihf-g++

+QMAKE_LINK_SHLIB = arm-linux-gnueabihf-g++

# modifications to linux.conf

-QMAKE_AR = arm-linux-gnueabi-ar cqs

-QMAKE_OBJCOPY = arm-linux-gnueabi-objcopy

-QMAKE_NM = arm-linux-gnueabi-nm -P

-QMAKE_STRIP = arm-linux-gnueabi-strip

+QMAKE_AR = arm-linux-gnueabihf-ar cqs

+QMAKE_OBJCOPY = arm-linux-gnueabihf-objcopy

+QMAKE_NM = arm-linux-gnueabihf-nm -P

+QMAKE_STRIP = arm-linux-gnueabihf-strip

+

+# support for OpenGL

+QMAKE_LIBS_EGL = -lEGL

+QMAKE_LIBS_OPENGL_ES1 = -lGLES_CM

+QMAKE_LIBS_OPENGL_ES2 = -lGLESv2

+#QMAKE_LIBS +=

+

load(qt_config)

diff -Naur qt-everywhere-opensource-src-5.2.1-old/qtbase/qmake/generators/makefile.cpp qt-everywhere-opensource-src-5.2.1/qtbase/qmake/generators/makefile.cpp

--- qt-everywhere-opensource-src-5.2.1-old/qtbase/qmake/generators/makefile.cpp 2014-02-02 04:37:29 +0800

+++ qt-everywhere-opensource-src-5.2.1/qtbase/qmake/generators/makefile.cpp 2014-08-26 13:53:15 +0800

@@ -1161,8 +1161,8 @@

QString srcf = (*sit).toQString();

QString dstf = (*oit).toQString();

- t escapeDependencyPath(dstf) ": " escapeDependencyPath(srcf)

- " " escapeDependencyPaths(findDependencies(srcf)).join(" \\\n\t\t");

+ t escapeDependencyPath(dstf).replace(QRegExp("\\\\"), "/") ": " escapeDependencyPath(srcf).replace(QRegExp("\\\\"), "/")

+ " " escapeDependencyPaths(findDependencies(srcf)).replaceInStrings(QRegExp("\\\\"), "/").join(" \\\n\t\t");

ProKey comp, cimp;

for(QStringList::Iterator cppit = Option::cpp_ext.begin(); cppit != Option::cpp_ext.end(); ++cppit) {

@@ -3346,6 +3346,8 @@

QString MakefileGenerator::installMetaFile(const ProKey replace_rule, const QString src, const QString dst)

{

QString ret;

+ QString src_p = src;

+ QString dst_p = dst;

if (project-isEmpty(replace_rule)

|| project-isActiveConfig("no_sed_meta_install")) {

ret += "-$(INSTALL_FILE) \"" + src + "\" \"" + dst + "\"";

@@ -3362,7 +3364,7 @@

+ "," + windowsifyPath(replace.toQString()) + ",gi");

}

}

- ret += " \"" + src + "\" \"" + dst + "\"";

+ ret += " \"" + src_p.replace(QRegExp("\\\\"), "/") + "\" \"" + dst_p.replace(QRegExp("\\\\"), "/") + "\"";

}

return ret;

}

struct TermChain {

TermChain(PatternTerm term)

diff -Naur qt-everywhere-opensource-src-5.2.1-old/qttools/src/linguist/lrelease/lrelease.pro qt-everywhere-opensource-src-5.2.1/qttools/src/linguist/lrelease/lrelease.pro

--- qt-everywhere-opensource-src-5.2.1-old/qttools/src/linguist/lrelease/lrelease.pro 2014-02-02 04:37:57 +0800

+++ qt-everywhere-opensource-src-5.2.1/qttools/src/linguist/lrelease/lrelease.pro 2014-08-28 10:42:55 +0800

@@ -1,4 +1,7 @@

option(host_build)

+

+win32-g++*:QMAKE_CXXFLAGS_CXX11 = -std=gnu++0x

+

QT = core-private

DEFINES += QT_NO_CAST_FROM_ASCII QT_NO_CAST_TO_ASCII

diff -Naur qt-everywhere-opensource-src-5.2.1-old/qttools/src/linguist/lupdate/lupdate.pro qt-everywhere-opensource-src-5.2.1/qttools/src/linguist/lupdate/lupdate.pro

--- qt-everywhere-opensource-src-5.2.1-old/qttools/src/linguist/lupdate/lupdate.pro 2014-02-02 04:37:57 +0800

+++ qt-everywhere-opensource-src-5.2.1/qttools/src/linguist/lupdate/lupdate.pro 2014-08-28 10:46:59 +0800

@@ -1,4 +1,7 @@

option(host_build)

+

+win32-g++*:QMAKE_CXXFLAGS_CXX11 = -std=gnu++0x

+

QT = core-private

qtHaveModule(qmldevtools-private) {

接下来开始配置:

其中-extprefix定义安装位置,在编译完以后可以改,一会儿说;-prefix、-plugindir、-importdir、-qmldir定义的位置是目标板上的位置,加双斜杠是为了防止MSYS翻译这些路径成MSYS的路径,其他的设定与Linux下的编译没有不同。Linux下编译的sysroot可以拷贝到例如:E:/MinGW/opt/sysroot-arm。

然后编译

make module-qtbase

make module-qtdeclarative

cd qttools/src/linguist

../../../qtbase/bin/qmake.exe -unix linguist.pro

make

编译的时候可能会有几个库有链接错误,找不到一大堆gl、egl打头的函数,这是因为相应的Makefile里面的LIBS没有自动加上-lEGL -lGLES_CM -lGLESv2;但是正式使用qmake的时候不会,很奇怪;因为也就几个地方,出问题了手工加一下吧,我没去查原因改代码。

编译linguist的时候可能会遇到这个问题:,按里面说的处理。

编译完了以后,把下列文件拷贝到Linux下编译的ARM QT开发包的bin目录中去:

然后,删掉对应的ARM QT开发包的bin目录中没有exe后缀的文件,那些是Linux下的。

最后一步,确保安装路径正确,也就是说,如果配置Windows下QT的时候设定-extprefix E:/MinGW/opt/qt/5.2.1/arm,那就要把替换过exe文件的ARM QT开发包放到这个位置,如果路径改了,可以用二进制搜索工具去qmake.exe中替换这个字串。

补充一下关于调试的问题,其实不是很关键。

在使用Debug模式编译的时候,最后会出现如下提示:

warning: A handler for the OS ABI "GNU/Linux" is not built into this configuration

of GDB. Attempting to continue with the default i386 settings.

这是因为在mkspecs/features/unix/gdb_dwarf_index.prf中,有这样一段:

QMAKE_GDB_INDEX += \

test \$\$(gdb --version | sed -e \'s,[^0-9][^0-9]*\\([0-9]\\)\\.\\([0-9]\\).*,\\1\\2,;q\') -gt 72 \

gdb --nx --batch --quiet -ex \'set confirm off\' -ex \"save gdb-index $$QMAKE_GDB_DIR\" -ex quit \'$(TARGET)\' \

test -f $(TARGET).gdb-index \

$$QMAKE_OBJCOPY --add-section \'.gdb_index=$(TARGET).gdb-index\' --set-section-flags \'.gdb_index=readonly\' \'$(TARGET)\' \'$(TARGET)\' \

$$QMAKE_DEL_FILE $(TARGET).gdb-index || true

很显然,这段代码把调试用的GDB默认为“gdb”了,所以应该改成你用的gdb,比如arm-linux-gnueabihf-gdb。另外,这里的sed对GDB版本的判断,无法识别像“GNU gdb (Sourcery CodeBench Lite 2014.05-29) 7.7.50.20140217-cvs”这样的版本信息的,只能识别像“GNU gdb (GDB) 7.6.1”这样的版本信息,所以你有可能看不到刚才那段提示。想解决,要么重新写一段sed的正则表达式,要么直接就把这个test ... -gt 72删掉。

改了QT的源码怎么编译

你想要修改源代码,首先你要拿到源代码。

如果你拿不到,那对于iOS来说就不用想了(反编译也就能到二进制文件,如果你感兴趣也可以尝试修改二进制文件),你是无法修改的。

对于Android,可以将apk反编译回代码,但是Android开发者基本都会在发布之前采取一些防反编译的措施(比如代码混淆),所以你可以想象拿到的代码的可读性…

反编译和修改这种行为极有可能构成侵权,请尊重每个开发者,不论出于学习目的还是其他目的

发表评论

评论列表

  • 孤央并安(2022-06-12 22:25:14)回复取消回复

    SROOT#$SYSROOT#g" | sed "s#$ROOTDIR##g"最后去掉$ROOTDIR前缀是为了和Linux Makefile兼容,同时也不会影响在make中的地址转换,最后,QT源