2016-07-14 102 views
4

對於一個過時的嵌入式項目,我試着在多系統設置(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),但這些也沒有給我任何有用的提示。

誰可以給我一個指針,我可以嘗試找到原因並解決或解決此問題?

+0

原因:引導程序庫編譯時包含錯誤的include路徑,它只對目標環境有效。將它們從bootstrap makefiles中移除,然後運行'uic'。我現在試着想出一個解決方案。 – Murphy

回答

2

此問題的原因是使用-I-L選項向configure腳本提供了額外的目標特定包含和lib目錄。這些也用於bootstrap的構建,這在舊系統中並不重要,主機和目標的頭部顯然彼此足夠接近。

一旦移動到目標mkspec文件並添加到QMAKE_CFLAGSQMAKE_CXXFLAGSQMAKE_LFLAGS生成過程正常工作。