亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SylixOS之glib庫移植筆記

發布時間:2020-02-28 13:28:02 來源:網絡 閱讀:1151 作者:張榮榮123 欄目:系統運維

1.glib中間件

glib庫是Linux平臺下最常用的C語言函數庫,它具有很好的可移植性和實用性。

glibGTK+GNOME工程的基礎底層核心程序庫,是一個綜合用途的實用的輕量級的C程序庫,它提供C語言的常用的數據結構的定義、相關的處理函數,有趣而實用的宏,可移植的封裝和一些運行時機能,如事件循環、線程、動態調用、對象系統等的API。它能夠在類UNIX的操作系統平臺(如LINUXHP-UNIX等),WINDOWSOS2BeOS等操作系統臺上運行。

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.gzlibffi源碼包下載地址:https://www.sourceware.org/libffi/

3.1在Linux下生成配置文件

根據評估了解glib工程比較大,采用一般方法直接移植編譯問題太多,無法快速解決問題。在官網上了解glib庫整個工程又分成三個小的工程,如 31所示。

SylixOS之glib庫移植筆記

圖3-1 glib工程框架圖

根據glib工程框架圖可知,可以把整個分為三個模塊:libgiolibgobjectlibglib三個部分。

把官網下載的源碼在Linux環境下編譯執行,產生配置文件如 32所示。

SylixOS之glib庫移植筆記

圖 3-2  Linux環境生成配置文件

         自動配置產生了Makefileconfig.h文件,這兩個是移植的關鍵。根據 31所示,把整個工程分成三個模塊,在自動配置時,在各個模塊下也生成各個模塊的配置文件,如 33 34 35所示。

SylixOS之glib庫移植筆記

圖 3-3  libgio工程配置

SylixOS之glib庫移植筆記

圖 3-4  libgobject工程配置

SylixOS之glib庫移植筆記

圖 3-5 libglib工程配置

         所以根據這三個模塊下的Makefile分別編譯libgiolibgobjectlibglib這三個模塊,最后在把這三個模塊整合起來成為一個完整的glib庫工程。

這樣在Linux環境下生成了配置文件,然后把整個源碼包導出。

3.2移植到SylixOS

把源碼工程導入到RealEvo-IDE開發環境上進行開發編譯。

3.2.1創建libgio模塊工程

創建libgio工程,并把gio源碼導入工程如 36所示。

SylixOS之glib庫移植筆記

圖 3-6 libgio工程

    設置工程為專家模式,即手動修改Makefile。根據libgio模塊下的Makefile配置工程的gio.mk,如 37所示。然后編譯工程根據錯誤提示修改。

  SylixOS之glib庫移植筆記

圖 3-7 libgio的gio.mk配置

3.2.2創建libgobject模塊工程

創建libgobject工程,并把gobject源碼導入工程如 38所示。

SylixOS之glib庫移植筆記

圖 3-8  libgobject工程

設置工程為專家模式,即手動修改Makefile。根據libgobject模塊下的Makefile配置工程的gobject.mk,如 39所示。然后編譯工程根據錯誤提示修改。

SylixOS之glib庫移植筆記

圖 3-9 libobject的object.mk配置

3.2.3創建libglib模塊工程

創建libglib工程,并把libglib源碼導入工程如 310所示。

SylixOS之glib庫移植筆記

圖 3-10 libglib工程

    設置工程為專家模式,即手動修改Makefile。根據libglib模塊下的Makefile配置工程的glib.mk,如 311所示。然后編譯工程根據錯誤提示修改。

SylixOS之glib庫移植筆記

圖 3-11 libglib的glib.mk配置

當三個模塊編譯都能通過時,進行工程整合如 312所示。

SylixOS之glib庫移植筆記

圖 3-12 libglib工程整合

把三個工程的*.mk的配置整合到libglib.mk上,如 313所示。

SylixOS之glib庫移植筆記

圖 3-13 libglib.mk整合

這樣把三個工程整合起來初步編譯時通過的,然后進行功能測試時,慢慢完善工程。

3.2.5修改編譯錯誤

        1.

這邊有些頭文件加上這一句,因為這邊暫未定義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_DIRgiomodule.c文件388行使用,未定義),這個在LinuxMakefile定義為安裝目錄下/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文件20992132974985996行)計算時間精度為微妙級,和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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

东兴市| 甘孜县| 绥德县| 连云港市| 扎兰屯市| 牡丹江市| 乾安县| 南靖县| 巴彦淖尔市| 无极县| 澄城县| 临武县| 泰州市| 曲松县| 方城县| 吴桥县| 合阳县| 康保县| 泰安市| 平昌县| 微博| 灵石县| 敖汉旗| 都昌县| 昭通市| 卓资县| 文安县| 根河市| 遵化市| 安西县| 车致| 融水| 保山市| 会同县| 太谷县| 天气| 遂宁市| 阳朔县| 莱西市| 井陉县| 南宁市|