交叉编译Qt4:uic segfaults

时间:2016-07-14 14:34:38

标签: qt ubuntu qt4 cross-compiling

对于过时的嵌入式项目,我尝试在当前的Ubuntu 16.04 x86_64 系统上使用multiarch设置(amd64 + i386)交叉编译Qt 4.7.4。

交叉编译曾经为Ubuntu 12.04 x86 设置,并且在那里运行良好。在主机调试的新系统上进行编译(主机和目标平台设置为x86 / i386 / 32位)也运行良好。但是,当我尝试为目标系统(arm)交叉编译它时,主机在构建uic lib时设置为i386 QtGui段错误。

以下相关标志用于为目标系统配置Qt:

-host-arch i386 -platform qws/linux-x86-g++ 
-embedded arm -xplatform qws/linux-gnueabi-arm-mucross-g++

此外,mkspecs/qws/linux-x86-g++/qmake.conf已修补为包含一些编译器标志,这些标志似乎是编译和链接正确所必需的:

QT_ARCH = I386
QMAKE_CFLAGS += -m32
QMAKE_CXXFLAGS += -m32
QMAKE_LFLAGS += -m32

这是失败的电话:

/<project>/qt-target/bin/uic /<project>/qt-everywhere-opensource-src-4.7.4/src/gui/dialogs/qpagesetupwidget.ui -o .uic/release-shared-emb-arm/ui_qpagesetupwidget.h

我可以手动重现segfault并进行调试。 strace没有显示任何明显的东西,正在加载正确的i386库。这是gdb回溯的第一行:

Program received signal SIGSEGV, Segmentation fault.                            
__GI___fesetenv (envp=0xffffbbd4) at ../sysdeps/i386/fpu/fesetenv.c:116         
116     ../sysdeps/i386/fpu/fesetenv.c: Datei oder Verzeichnis nicht gefunden.  
(gdb) backtrace                                                                 
#0  __GI___fesetenv (envp=0xffffbbd4) at ../sysdeps/i386/fpu/fesetenv.c:116     
#1  0x080fa7de in qdtoa (d=9999.9899999999998, mode=2, ndigits=6,               
    decpt=0xffffbce8, sign=0xffffbcec, rve=0xffffbcf4, resultp=0xffffbcf8)      
    at /<project>/qt-everywhere-opensource-src-4.7.4/src/corelib/tools/qlocale.cpp:6655                                              
#2  0x080fc230 in QLocalePrivate::doubleToString (                              
    this=0x8181160 <locale_data>, d=9999.9899999999998, precision=2,            
    form=<optimized out>, width=0, flags=<optimized out>)                       
    at /<project>/qt-everywhere-opensource-src-4.7.4/src/corelib/tools/qlocale.cpp:4012                                              
#3  0x0811da6f in QString::setNum (this=0xffffbf78, n=9999.9899999999998,       
    f=<optimized out>, prec=6)                                                  
    at /<project>/qt-everywhere-opensource-src-4.7.4/src/corelib/tools/qstring.cpp:5930                                              
#4  0x0811ddca in QString::number (n=9999.9899999999998, f=103 'g', prec=6)     
    at /<project>/qt-everywhere-opensource-src-4.7.4/src/corelib/tools/qstring.cpp:6034

有些调查带我到fesetenv()中的glibc bug已经在glibc 2.23中修复了,但由于已经安装了(libc6 2.23-0ubuntu3),我在这里没有进一步了解。断层线116已经introduced by that fix,但缺乏对内部的了解,我无法指出段错误的原因:

__asm__ ("ldmxcsr %0" : : "m" (mxcsr));

此外,对于引导程序构建(包括uic),有一些旧的,已关闭的或未解决的Qt bug reports,但这些并没有给我任何有用的提示。

谁可以给出指针,我可以尝试找到原因并解决或解决此问题?

1 个答案:

答案 0 :(得分:2)

此问题的原因是,使用configure-I选项向-L脚本提供了其他特定于目标的include和lib目录。这些也用于引导构建,这在旧系统上并不重要,其中主机和目标的头部显然彼此足够接近。

移入目标mkspec文件并添加到QMAKE_CFLAGSQMAKE_CXXFLAGSQMAKE_LFLAGS后,构建过程就可以正常运行。

相关问题