您好,登錄后才能下訂單哦!
1.glib中間件
glib庫是Linux平臺下最常用的C語言函數庫,它具有很好的可移植性和實用性。
glib是GTK+和GNOME工程的基礎底層核心程序庫,是一個綜合用途的實用的輕量級的C程序庫,它提供C語言的常用的數據結構的定義、相關的處理函數,有趣而實用的宏,可移植的封裝和一些運行時機能,如事件循環、線程、動態調用、對象系統等的API。它能夠在類UNIX的操作系統平臺(如LINUX,HP-UNIX等),WINDOWS,OS2和BeOS等操作系統臺上運行。
2.移植思路
移植Linux中間件到SylixOS上的思路請參考《TN0029_SylixOS第三方中間件移植方法》。
3.移植實現
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下生成配置文件
根據評估了解glib工程比較大,采用一般方法直接移植編譯問題太多,無法快速解決問題。在官網上了解glib庫整個工程又分成三個小的工程,如圖 31所示。
圖3-1 glib工程框架圖
根據glib工程框架圖可知,可以把整個分為三個模塊:libgio、libgobject和libglib三個部分。
把官網下載的源碼在Linux環境下編譯執行,產生配置文件如圖 32所示。
圖 3-2 Linux環境生成配置文件
自動配置產生了Makefile和config.h文件,這兩個是移植的關鍵。根據圖 31所示,把整個工程分成三個模塊,在自動配置時,在各個模塊下也生成各個模塊的配置文件,如圖 33、圖 34、圖 35所示。
圖 3-3 libgio工程配置
圖 3-4 libgobject工程配置
圖 3-5 libglib工程配置
所以根據這三個模塊下的Makefile分別編譯libgio、libgobject和libglib這三個模塊,最后在把這三個模塊整合起來成為一個完整的glib庫工程。
這樣在Linux環境下生成了配置文件,然后把整個源碼包導出。
3.2移植到SylixOS
把源碼工程導入到RealEvo-IDE開發環境上進行開發編譯。
3.2.1創建libgio模塊工程
創建libgio工程,并把gio源碼導入工程如圖 36所示。
圖 3-6 libgio工程
設置工程為專家模式,即手動修改Makefile。根據libgio模塊下的Makefile配置工程的gio.mk,如圖 37所示。然后編譯工程根據錯誤提示修改。
圖 3-7 libgio的gio.mk配置
3.2.2創建libgobject模塊工程
創建libgobject工程,并把gobject源碼導入工程如圖 38所示。
圖 3-8 libgobject工程
設置工程為專家模式,即手動修改Makefile。根據libgobject模塊下的Makefile配置工程的gobject.mk,如圖 39所示。然后編譯工程根據錯誤提示修改。
圖 3-9 libobject的object.mk配置
3.2.3創建libglib模塊工程
創建libglib工程,并把libglib源碼導入工程如圖 310所示。
圖 3-10 libglib工程
設置工程為專家模式,即手動修改Makefile。根據libglib模塊下的Makefile配置工程的glib.mk,如圖 311所示。然后編譯工程根據錯誤提示修改。
圖 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 |
編譯時經常出現的錯誤,解決方法是在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結構體與系統沖突。dirent結構體是存儲短文件名信息,與glib不吻合。為編譯使用,在acoinfo.h定義dirent結構體。
SylixOS結構體:
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 索引節點號 */ 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結構體
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結構體
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.
我們系統下沒有libintl.h頭文件,主要是用作數據窗口控件的。SylixOS暫時不支持,所以在config.h中關閉宏ENABLE_NLS。
6.
向AI問一下細節
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。