標籤:定位在 獨立 人性化 lan 源碼 man elf str target
一.函數庫的區別
linux下的C函數庫和windows下的函數庫系統調用的機制不一樣,Glibc包含了主要的C庫。
這個庫提供了基本常式,用於分配記憶體、搜尋目錄、開啟關閉檔案、讀寫檔案、字串處理、模式比對、數學計算等等。
所說的機制不一樣不單是指中斷號的問題,中斷號也是通過input參數和output把函數地址和輸出地址定位在寄存器的,那些函數在windows和linux下的實現應該是不一樣的,就拿檔案系統來說,ext3和fat32的怎麼可能一樣.還有mm記憶體管理,都是不一樣的.中斷還是屬於硬體層的,X86上的應該都差不多,但作業系統層的實現就大不相同了。
windows C庫格式為 .dll( 動態連結程式庫英文為DLL,是Dynamic Link Library 的縮寫形式,DLL是一個包含可由多個程式同時使用的代碼和資料的庫,DLL不是可執行檔)。 產生的*.exe 。
linux C 庫格式為 .so(.so 為共用庫 : 動態庫(shared library/shared object/dynamic link library)。產生*elf(Linux ELF ELF = Executable and Linkable Format),可執行串連格式,是UNIX系統實驗室(USL)作為應用程式二進位介面(Application Binary Interface,ABI)而開發和發布的。副檔名為elf)。
標準 C 庫函數以及資料類型等在任何作業系統下都可以編譯運行,並且效果是完全一樣的,但其內部的實現原理及儲存方式不一定一樣。這些庫函數實際上在不同系統作業系統上的實現就是依賴於作業系統本身的 API。Linux 上當然就是 Linux 的 API,而 Windows 則是 Windows API。就像最常見的 fopen 函數,在 Windows 上他是通過 CreateFile 函數實現的,而 Linux 上則是通過 open 函數。API 說白了就是函數,通常說 API 指的是作業系統函數。Linux 的 shell 相當於 Windows 的命令列,它只不過是一個解析命令和執行程式的環境。這個環境其實也是一個獨立的程式。任何平台的程式要運行,就得依賴於該作業系統的 API。
二.其他區別
1)系統平台不一樣
底層開發就涉及到了系統核心的問題,對於linux來說,你可以知道它裡面是什麼結構,而windows。。。
2)編譯器環境不一樣
linux採用gcc編譯器,gdb調試工具,和多種可視化的編輯器如 emacs,kedit等等,也有文本的vi/vim,GDB的功能是非常強大的,個人認為較win下的好。儘管win下的mingw,devcpp整合了gcc,但是搞的總讓人不爽~,gcc對標準的支援是相當的好。
3)針對人群不一樣
win下主要還是面向商業化的開發,而絕大多數的編程愛好者則喜歡屬於自己開闊自由的系統下編程,不願意禁錮在windows下(MS)的包圍中。
4)發展方向不一樣。
OpenSource的思想已經在linux這片淨土開花(參見GPL....)。
找資料方便,原始碼公開,可以體驗開發的樂趣。
win下,ms逐步把一批開發人員束縛在它自己的系統裡面,開發環境越來越傻瓜,這能不能叫人性化呢?搞到最後。。。可能越走越遠~
5)著作權問題
win下的好多好多東西都涉及到著作權問題,linux的free軟體雖然是自由軟體,不過好多好多都是免費用於商業化的。。。當然有的需要開放原始碼,好多也不需要。C++的區別也差不多
三.總結
Linux 簡單來說跟 Windows 一樣是一種作業系統,只是兩者之間的使用方法和習慣有所區別。具體的區別其實很大,不過已經不是能在這裡說清楚的事情了。
對於 C 編程來說,他們最大的區別就是提供給你的系統相關的特性不一樣。這個導致了所謂的移植性問題以及平台特性的問題。形象點的比喻是你可以認為 Linux 和 Windows 都是人。他們都懂一部分英語,但是一個的母語是漢語,一個是德語。你用的英語如果他們剛好都懂,那他們就能很好的幫你做事。如果你說的英語他們不懂,那就只能用他們的母語給他們說。這樣的結果就是你用德語說的 Linux 聽不懂;你用漢語說的 Windows 又聽不懂。所以,如果是簡單的編程,那他們沒有多大區別。如果是複雜的...你就準備翻譯一方的母語成另一方的母語吧。
由於著作權原因,庫函數的原始碼一般是不可見的,但在標頭檔中你可以看到它對外的介面。
庫函數是人家寫的程式,你拿來用在你的程式裡.
首先標準只是規定了這些函數的介面和具體的運行效率的要求,這些函數具體是怎麼寫得要看各個編譯器的實現和平台。
如果你用的是visual studio的話,微軟提供了一部分C運行時(CRT)的源碼,裡面會有memcpy,strcpy之類的函數的實現,我的visual studio 2005下的路徑是C:\Program Files\Microsoft Visual Studio 8\VC\crt\src,你可以對比參照一下。
其他差異詳見:《Linux/Windows下 C/C++開發的差異zz》
四.問答
1)求教 C語言的數學庫函數與標準庫函數 有什麼不同?
c語言的標準變化了好幾次,現在說的標準C語言指的是99年制定的C99標準。其中定義的函數庫就是C語言標準函數庫。具體有哪些你可以查詢《C語言參考手冊(C:A Reference Manual,Fifth Edition》。
但事實上,每個C/C++編譯器都帶有自身的函數庫,一般都相容C標準函數庫,但也有個別的有些細節上的出入。所以,一般你只要考察你所用編譯器的函數庫就行了(通常都可以從協助中得到)。
數學函數是標準庫函數的一種。
標準庫函數優先使用了,可實現平台無關。應用程式介面API函數是平台相關的。
編譯器函數是指MFC/VCL之類的類庫函數吧,打包成程式後必須帶上函數庫。
標準庫函數是由一個語言的標準來決定的,API函數是由作業系統提供的。標準庫函數大多數時候也要通過調用api函數來達到目的。但是自己用的時候,我覺得還是能調用標準庫函數實現這樣就最好。這樣移植性好得多。
標準庫函數自然是優先了,標準庫可實現與平台無關。
如果用到系統編程的話,使用API,但是一般的IDE都會對API有封裝,比如mfc,所以使用mfc更方便些。當然有些時候直接用API解決某些問題也是很方便的。
編譯器函數?如果指mfc之類的,就是上面我說的,
否則如果你用的C++的話,一般的編譯器都有實現標準庫.直接使用標準庫就行.
還有一些其他的流行的庫也可以。C++的准標準庫boost,可以參考www.boost.org。
linux下的qt,是個GUI庫,類似windows下的mfc,但是是用標準c++實現的。
標準庫函數:是一種程式規範,提供一套標準的函數,可能有好幾種規範,如c99,標準c
編譯器函數:是用來告訴編譯器怎麼編譯你的程式的,如#define,#typedef
API函數:作業系統提供,的函數用來支援這個平台上的操作的,如MFC
標準庫是一種規範和標準可以非常方便的跨平台。編譯器函數一般是編譯器的類庫提供的,API一般由作業系統來提供。後兩者都有一定的局限性
C++和C在linux下 和在windows下有什麼區別?