Build Qt5.3.1 for Freescale I.MX6Q based Linux 3.0.15

在移植QT5到 IMX6Q linux平臺時,一次又一次的升級,帶來了一些明顯的性能提升,這說明在嵌入式上,QT底層對OpenGL egl 的優化做的越來越好,越來越兼容.在Qt5.1 - Qt5.2 的系列版本中qml部分和多媒體部分一直都沒法成功的編譯進去,只能編譯qtbase. 而在qt5.3.1的時候按照QT 官方的arm編譯指南,輕鬆的編譯了能編譯的每一個模塊,當然,除了webkit這種變態的東西.

因爲是官方的arm編譯指南,所以什麼configure腳本我就不寫了,完全是按照官方的編譯步驟. 雖說輕鬆編譯,其實也不是一氣呵成的,其中有些小的錯誤.經過修改源代碼中的一些bug,完全可以編譯成功;

多線程編譯的log不怎麼好看,主要的錯誤內容就是,在編譯fontconfig時出現錯誤:FC_WEIGHT_ULTRABLACK 未申明,定位到文件qtbase/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp 

static inline int weightFromFcWeight(int fcweight)
{ // Font Config uses weights from 0 to 215 (the highest enum value) while QFont ranges from 
  // 0 to 99. The spacing between the values for the enums are uneven so a linear mapping from 
  // Font Config values to Qt would give surprising results. So, we do a piecewise linear 
  // mapping. This ensures that where there is a corresponding enum on both sides (for example
  // FC_WEIGHT_DEMIBOLD and QFont::DemiBold) we map one to the other but other values map
  // to intermediate Qt weights. 
const int maxWeight = 99; 
int qtweight; 
if (fcweight < 0) qtweight = 0;
else if (fcweight <= FC_WEIGHT_LIGHT) qtweight = (fcweight * QFont::Light) / FC_WEIGHT_LIGHT; 
else if (fcweight <= FC_WEIGHT_NORMAL) qtweight = QFont::Light + ((fcweight - FC_WEIGHT_LIGHT) * (QFont::Normal - QFont::Light)) / (FC_WEIGHT_NORMAL - FC_WEIGHT_LIGHT); 
else if (fcweight <= FC_WEIGHT_DEMIBOLD) qtweight = QFont::Normal + ((fcweight - FC_WEIGHT_NORMAL) * (QFont::DemiBold - QFont::Normal)) / (FC_WEIGHT_DEMIBOLD - FC_WEIGHT_NORMAL); 
else if (fcweight <= FC_WEIGHT_BOLD) qtweight = QFont::DemiBold + ((fcweight - FC_WEIGHT_DEMIBOLD) * (QFont::Bold - QFont::DemiBold)) / (FC_WEIGHT_BOLD - FC_WEIGHT_DEMIBOLD); 
else if (fcweight <= FC_WEIGHT_BLACK) qtweight = QFont::Bold + ((fcweight - FC_WEIGHT_BOLD) * (QFont::Black - QFont::Bold)) / (FC_WEIGHT_BLACK - FC_WEIGHT_BOLD); 
else if (fcweight <= FC_WEIGHT_ULTRABLACK) qtweight = QFont::Black + ((fcweight - FC_WEIGHT_BLACK) * (maxWeight - QFont::Black)) / (FC_WEIGHT_ULTRABLACK - FC_WEIGHT_BLACK); 
else qtweight = maxWeight;
return qtweight;
}

然而在對源代碼進行文本搜索時,發現FC_WEIGHT_ULTRABLACK是定義了的,只是在對arm平臺進行編譯時,被條件編譯的宏給排除出去了,才導致這樣的錯誤的.所以這樣其實這個問題就好解決了.下面是一種解決方法,或者更簡單的,直接註釋掉錯誤的部分也可以,因爲這一塊字體部分對實際使用沒有影響.

patch:

--- a/src/corelib/global/qprocessordetection.h
+++ b/src/corelib/global/qprocessordetection.h@@ -339,8 +339,10 @@ # define Q_PROCESSOR_WORDSIZE __SIZEOF_POINTER__ # elif defined(_LP64) || defined(__LP64__) || defined(WIN64) || defined(_WIN64) # define Q_PROCESSOR_WORDSIZE 8-# else+# elif defined(QT_POINTER_SIZE) # define Q_PROCESSOR_WORDSIZE QT_POINTER_SIZE+# else+# define Q_PROCESSOR_WORDSIZE sizeof(void*) # endif #endif --- a/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp+++ b/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp@@ -61,6 +61,10 @@ #include <fontconfig/fcfreetype.h> #endif +#ifndef FC_WEIGHT_ULTRABLACK+#define FC_WEIGHT_ULTRABLACK FC_WEIGHT_BLACK+#endif+ QT_BEGIN_NAMESPACE static inline bool requiresOpenType(int writingSystem)


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