對於一個過時的嵌入式項目,我試着在多系統設置(amd64 + i386)的當前Ubuntu 16.04 x86_64系統上交叉編譯Qt 4.7.4。交叉編譯Qt4:uic段錯誤
交叉編譯曾經爲Ubuntu 12.04 x86設置,它在那裏運行良好。在用於主機調試的新系統(主機和目標平臺設置爲x86/i386/32位)上編譯它也運行良好。但是,當我嘗試爲目標系統(arm)交叉編譯時,主機設置爲i386 uic
segfaults,同時構建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
我可以手動重現段錯誤並進行調試。 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));
此外,還有一些老的,封閉的或尚未解決Qt bug reports關於引導構建(其中包括uic
),但這些也沒有給我任何有用的提示。
誰可以給我一個指針,我可以嘗試找到原因並解決或解決此問題?
原因:引導程序庫編譯時包含錯誤的include路徑,它只對目標環境有效。將它們從bootstrap makefiles中移除,然後運行'uic'。我現在試着想出一個解決方案。 – Murphy