淺談Windows體系下C說話編程中Glib庫的應用。本站提示廣大學習愛好者:(淺談Windows體系下C說話編程中Glib庫的應用)文章只能為提供參考,不一定能成為您想要的結果。以下是淺談Windows體系下C說話編程中Glib庫的應用正文
在這個C的釀成世界裡,有很多適用的庫,個中最著名的且最通用(跨多個平台的完成包含Windows,要曉得許多適用的編程庫都不供給Windows的完成)就是GLib這個庫,個中就有完成線程的部門。
glib庫是Linux平台下最經常使用的C說話函數庫,它具有很好的可移植性和適用性。
glib是Gtk +庫和Gnome的基本。glib可以在多個平台下應用,好比Linux、Unix、Windows等。glib為很多尺度的、經常使用的C說話構造供給了響應的替換物。
假如在法式中要應用到glib庫中的函數,則應當包括glib.h頭文件(在gtk.h和gnome.h頭文件中曾經包括了glib.h了。
然則,由於這是中文的,看的人天然不是歪果仁,中國編程老手年夜都照樣習氣用 Windows 情況,也不做強求,仁者見仁智者見智,後續會有一個法式作為例子,個中簡略的運用了多線程的常識來寫一個備份軟件,線程的完成是用的 Windows 本身的接口,一切這些接口都能在 MSDN 裡查找到響應文檔。
Glib庫在Windows下的設置裝備擺設
之所以不說 *nix 體系下的設置裝備擺設是由於,哪裡的設置裝備擺設太無腦了,特殊是Ubuntu,一句敕令+有收集根本就設置裝備擺設終了了。
應用的是穩固版的2.28.8版本,截至今朝可用的最高穩固版本為2.46.x版本
將預處置設置裝備擺設好一些步調的glib打包放在我的網盤中,可以直接下載,添加IDE的途徑就可以應用,這是關於 Visual C++ 系列編譯器能用,假如用 MinGW 系列的編譯器就須要從新編譯
假如想本身設置裝備擺設,也能夠前去這個網址停止下載,或許前去GNU項目主頁下載最新的源碼和工程文件自我編譯,方法有許多,不應用現有二進制而自行選擇編譯的年夜概莫過於想應用MinGW,在MinGW項目標主頁也有引見
假如資本太少,可以參考若何編譯GTK項目標辦法,由於GLib的前身就是GTK的一部門,只不外後來自力出來了。
微軟的宇宙級編譯器Visual Studio關於C89(C90)以後的尺度其實不支撐,然則對個中的特征卻早早停止了完成(即沒有可開啟尺度的選項,然則新尺度所說的特征它都具有,都可以或許應用,乃至還要加倍超前)
故接上去的備份法式將應用Visual Studio 2013 停止編寫。
設置裝備擺設glib-2.28.8
下載編譯好的二進制包,預處置好(某些操作,不多說,網上有教程,記得用谷歌,或許到博客園裡找相似的,然則版本比擬老能夠和我用的有一些前途,但可以依著葫蘆畫瓢)今後,將途徑設置裝備擺設到工程裡:
創立一個Win32法式,而且在屬性治理器(左邊欄下部尋覓)中創立屬性表(Debug和Release各創立一個,設置都雷同便可)
翻開新建的屬性表
通用屬性->VC++目次->包括目次->編纂 添加下載上去的文件中的glib\glib2.28\include目次,不寧神的還可以再添加一個glib\glib2.28\lib\glib-2.0\include目次
通用屬性->VC++目次->庫目次->編纂 添加glib\glib2.28\lib目次
通用屬性->鏈接器->輸出->附加依附項 添加glib\glib2.28\lib目次下的一切.lib文件,行將這些文件的名字都手動輸出出來,假如應用我的這個版本的話那就是
gio-2.0.lib glib-2.0.lib gthread-2.0.lib gmodule-2.0.lib gobject-2.0.lib
通用屬性->C/C++->代碼生成->運轉庫開啟多線程/MT
Okay!成了
歇息一下
其實關於C法式員而言,最主要的莫過於應用一系列開源庫,而不是對新尺度的尋求,由於越低的尺度越輕易跨平台,關於庫而言這是前輩總結的一系列適用的數據構造和算法,乃至是適用的框架。我們紛歧定須要設置裝備擺設他們,而是從外面汲取一些他們的技巧,轉為本身的代碼,究竟庫關於許多法式員編寫的法式來講都年夜材小用了,但有時刻又不能不應用一些需要的數據構造和算法。
在年夜學的這幾年裡,或許是由於不外是一個吊車尾的一本,所以我沒法感觸感染到先生傳授帶來的教誨,然則也使得我深深的接觸到了開源,開源賜與了我許多,好比更坦蕩的編程思緒,更遼闊的氣量氣度,更有提高的動力,更多的小同伴。固然也曉得本身的微小。
是許多人(好比知乎的答復人和發問者),都提到要多不雅看C的源代碼, 然則這關於初學者,乃至如今的我感到也不是一件輕易的事,更遑論初入門的同窗了,特殊是關於很多上個世紀的年夜神,為了節儉空間和進步效力,的確是無所不消其極!固然某些用法可以或許被古代接收,然則你能在第一眼就看出來,為了結構一個紅黑樹節點,把樹的指針和節點的色彩信息都隱蔽在一個指針地址裡嗎?
/* 假定有一個節點的指針 p_node */ node_color = p_node->node_color & 1; /* 道理就是用最初一名bit來存儲色彩 */
個中在 Linux 裡, p_node->node_color 被設定為無符號的長整形,以整數型式存儲指針和色彩信息,而不是用指針類型。
node_pointer = (node_type*)p_node->node_color & ~3;/* 消除最初兩位上的bit的值 */
也就是消除色彩信息,留下的就是指針的值,即地址。
為何呢,只需我麼可以或許包管節點的創立地位是32位/64位對齊的,我們就可以夠包管它的最初兩位/三位是空的,相對不會被應用的。
/* 32位 */ sizeof(void*); /* 是 4 */ /* xxxx xxxx xxxx xxxx xxxx xxxx xxxx xx00 */ /* 64位 */ sizeof(void*); /* 是 8 */ /* 後方省略48位 xxxx xxxx xxxx x000 */
意思就是,關於指針而言,由於編譯器要包管尋址的高效所以它在給分派地址的時刻,會對齊內存中的地址,依照指針年夜小的倍數對齊,這就會招致分歧位的法式的指針變量的值中有幾個bit 會沒有應用,則用它來存儲。
詳細的情形,網路上的具體講解非常之多,開一個頭就好。然則這真的是我們一開端就應當接觸的嗎?
是
怎樣說,在許多的時刻,C說話給我們的函數都不敷平安靠得住,然則在我們沒法應用新尺度供給的函數的情形下(非常罕見)我們該若何做呢?固然是本身寫,怎樣寫更完善,天然是看看他人怎樣寫,而不是本身一爭光的糊弄,由於現實證實,自以為好的到最初都邑摔一跤,固然不是好事。
最簡略的做法就是用宏包裹一下,做一些預處置,或許關於宏機制不太愛好的人會選擇用一個函數停止包裹,也何嘗弗成。
注
寫在最末尾,填幾個後面挖的坑。
不曉得是否是有意的,普通GNU項目標子主頁面上,找不到(很難找到)對應的項目標下載地址,也就是光看著引見若何若何牛,若何若何好用,但就是不告知你去哪裡下,這時候候,起首確認你要下的這個軟件的名字,然後去GNU項目首頁裡的法式列內外找,在哪裡必定能找到,而不是在那些引見頁面亂點,成果基本找不到。
最典范的就是一個叫做GMP的開源軟件,用來自行編譯MinGW用的依附,願望能警省列位。
之所以用2.28.8而不是2.46.x是由於我其實不想本身在Windows上編譯了,由於年夜部門時刻,寫法式都是在 Linux 上,所以就偷懶一下。
關於我的文件是否是有毒,我說有毒,有一種叫做叫你再用Windows編程的毒。
好吧其實我認可Visual Studio切實其實是宇宙無敵的編譯器。
末尾
接上去的第三部門我會用一個備份法式來貫串
操作體系 : Windows
跨平台 : 否
API挪用 : Win32 API
編譯器 : Visual Studio 2013
說話 : Pure C Programing Language
會在外面引見一下,常在開源代碼中看見的一些奇異的器械,例如
#ifdef __cplusplus extern "c" { #endif ... #ifdef __cplusplus } #endif