1.glib中間件
十余年的天柱網(wǎng)站建設(shè)經(jīng)驗,針對設(shè)計、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時及時工作處理。全網(wǎng)營銷推廣的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動調(diào)整天柱建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計,從而大程度地提升瀏覽體驗。成都創(chuàng)新互聯(lián)從事“天柱網(wǎng)站設(shè)計”,“天柱網(wǎng)站推廣”以來,每個客戶項目都認真落實執(zhí)行。
glib庫是Linux平臺下最常用的C語言函數(shù)庫,它具有很好的可移植性和實用性。
glib是GTK+和GNOME工程的基礎(chǔ)底層核心程序庫,是一個綜合用途的實用的輕量級的C程序庫,它提供C語言的常用的數(shù)據(jù)結(jié)構(gòu)的定義、相關(guān)的處理函數(shù),有趣而實用的宏,可移植的封裝和一些運行時機能,如事件循環(huán)、線程、動態(tài)調(diào)用、對象系統(tǒng)等的API。它能夠在類UNIX的操作系統(tǒng)平臺(如LINUX,HP-UNIX等),WINDOWS,OS2和BeOS等操作系統(tǒng)臺上運行。
2.移植思路
移植Linux中間件到SylixOS上的思路請參考《TN0029_SylixOS第三方中間件移植方法》。
3.移植實現(xiàn)
glib源碼包下載地http://ftp.gnome.org/pub/gnome/sources/glib/2.24/,使用的是glib-2.22.5.tar.gz。在Linux下編譯glib需要libffi的支持,所以需要先交叉編譯libffi庫,使用的是libffi-3.2.1.tar.gz。libffi源碼包下載地址:https://www.sourceware.org/libffi/。
3.1在Linux下生成配置文件
根據(jù)評估了解glib工程比較大,采用一般方法直接移植編譯問題太多,無法快速解決問題。在官網(wǎng)上了解glib庫整個工程又分成三個小的工程,如圖 31所示。
圖3-1 glib工程框架圖
根據(jù)glib工程框架圖可知,可以把整個分為三個模塊:libgio、libgobject和libglib三個部分。
把官網(wǎng)下載的源碼在Linux環(huán)境下編譯執(zhí)行,產(chǎn)生配置文件如圖 32所示。
圖 3-2 Linux環(huán)境生成配置文件
自動配置產(chǎn)生了Makefile和config.h文件,這兩個是移植的關(guān)鍵。根據(jù)圖 31所示,把整個工程分成三個模塊,在自動配置時,在各個模塊下也生成各個模塊的配置文件,如圖 33、圖 34、圖 35所示。
圖 3-3 libgio工程配置
圖 3-4 libgobject工程配置
圖 3-5 libglib工程配置
所以根據(jù)這三個模塊下的Makefile分別編譯libgio、libgobject和libglib這三個模塊,最后在把這三個模塊整合起來成為一個完整的glib庫工程。
這樣在Linux環(huán)境下生成了配置文件,然后把整個源碼包導(dǎo)出。
3.2移植到SylixOS
把源碼工程導(dǎo)入到RealEvo-IDE開發(fā)環(huán)境上進行開發(fā)編譯。
3.2.1創(chuàng)建libgio模塊工程
創(chuàng)建libgio工程,并把gio源碼導(dǎo)入工程如圖 36所示。
圖 3-6 libgio工程
設(shè)置工程為專家模式,即手動修改Makefile。根據(jù)libgio模塊下的Makefile配置工程的gio.mk,如圖 37所示。然后編譯工程根據(jù)錯誤提示修改。
圖 3-7 libgio的gio.mk配置
3.2.2創(chuàng)建libgobject模塊工程
創(chuàng)建libgobject工程,并把gobject源碼導(dǎo)入工程如圖 38所示。
圖 3-8 libgobject工程
設(shè)置工程為專家模式,即手動修改Makefile。根據(jù)libgobject模塊下的Makefile配置工程的gobject.mk,如圖 39所示。然后編譯工程根據(jù)錯誤提示修改。
圖 3-9 libobject的object.mk配置
3.2.3創(chuàng)建libglib模塊工程
創(chuàng)建libglib工程,并把libglib源碼導(dǎo)入工程如圖 310所示。
圖 3-10 libglib工程
設(shè)置工程為專家模式,即手動修改Makefile。根據(jù)libglib模塊下的Makefile配置工程的glib.mk,如圖 311所示。然后編譯工程根據(jù)錯誤提示修改。
圖 3-11 libglib的glib.mk配置
當三個模塊編譯都能通過時,進行工程整合如圖 312所示。
圖 3-12 libglib工程整合
把三個工程的*.mk的配置整合到libglib.mk上,如圖 313所示。
圖 3-13 libglib.mk整合
這樣把三個工程整合起來初步編譯時通過的,然后進行功能測試時,慢慢完善工程。
這邊有些頭文件加上這一句,因為這邊暫未定義GIO_COMPILATION宏。
#if!defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) #error"Only <gio/gio.h> can be included directly." #endif |
編譯時經(jīng)常出現(xiàn)的錯誤,解決方法是在acoinfo.h中定義#define GIO_COMPILATION
__GIO_GIO_H_INSIDE__這個宏在gio.h中定義#define。
2.
GIO_MODULE_DIR(giomodule.c文件388行使用,未定義),這個在Linux下Makefile定義為安裝目錄下/lib/gio/modules的路徑,在acoinfo.h中#define GIO_MODULE_DIR "/lib/modules";主要是為了加載路徑下的模塊。
3.
在glocalfileenumerator.c文件中使用dirent結(jié)構(gòu)體與系統(tǒng)沖突。dirent結(jié)構(gòu)體是存儲短文件名信息,與glib不吻合。為編譯使用,在acoinfo.h定義dirent結(jié)構(gòu)體。
SylixOS結(jié)構(gòu)體:
struct dirent { char d_name[NAME_MAX + 1]; /* 文件名 */ unsignedchar d_type; /* 文件類型 (可能為 DT_UNKNOWN)*/ char d_shortname[13]; /* fat短文件名 (可能不存在) */ PVOID *d_resv; /* 保留 */ }; |
重新定義(在Linux下找出來的):
struct acoinfo_dirent { long d_ino; /* inode number索引節(jié)點號 */ off_t d_off; /* offset to this dirent在目錄文件中的偏移 */ unsignedshort d_reclen; /* length of this d_name文件名長 */ unsignedchar d_type; /* the type of d_name文件類型 */ char d_name [NAME_MAX+1]; /* file name (null-terminated)文件名,最長256字符 */ }; |
4.
times[0].tv_usec = statbuf.st_atim.tv_nsec / 1000;(glocalfileinfo.c文件2099行2132行974行985行996行)計算時間精度為微妙級,和Linux下不同,所以修改成SylixOS擁有的。
SylixOS結(jié)構(gòu)體
struct stat { dev_t st_dev /* device */ ino_t st_ino; /* inode */ mode_t st_mode; /* protection */ nlink_t st_nlink; /* number of hard links */ uid_t st_uid; /* user ID of owner */ gid_t st_gid; /* group ID of owner */ dev_t st_rdev; /* device type (if inode device)*/ off_t st_size; /* total size, in bytes */ time_t st_atime; /* time of last access */ time_t st_mtime; /* time of last modification */ time_t st_ctime; /* time of last create */ blksize_t st_blksize; /* blocksize for filesystem I/O */ blkcnt_t st_blocks; /* number of blocks allocated */ void *st_resv1; void *st_resv2; void *st_resv3; }; |
Linux結(jié)構(gòu)體
struct stat { unsignedlong st_dev; /* Device. */ unsignedlong st_ino; /* File serial number. */ unsignedint st_mode; /* File mode. */ unsignedint st_nlink; /* Link count. */ unsignedint st_uid; /* User ID of the file's owner. */ unsignedint st_gid; /* Group ID of the file's group. */ unsignedlong st_rdev; /* Device number, if device. */ unsignedlong __pad1; long st_size; /* Size of file, in bytes. */ int st_blksize; /* Optimal block size for I/O. */ int __pad2; long st_blocks; /* Number 512-byte blocks allocated. */ long st_atime; /* Time of last access. */ unsignedlong st_atime_nsec; long st_mtime; /* Time of last modification. */ unsignedlong st_mtime_nsec; long st_ctime; /* Time of last status change. */ unsignedlong st_ctime_nsec; unsignedint __unused4; unsignedint __unused5; }; |
5.
我們系統(tǒng)下沒有l(wèi)ibintl.h頭文件,主要是用作數(shù)據(jù)窗口控件的。SylixOS暫時不支持,所以在config.h中關(guān)閉宏ENABLE_NLS。
6.
SylixOS之glib庫移植筆記
本文地址:http://jinyejixie.com/article0/iisjoo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計公司、網(wǎng)頁設(shè)計公司、關(guān)鍵詞優(yōu)化、全網(wǎng)營銷推廣、Google、網(wǎng)站策劃
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)