在C++中,庫的地位是非常高的。C++之父 Bjarne Stroustrup先生多次表示了設計庫來擴充功能要好過設計更多的語法的言論。現實中,C++的庫門類繁多,解決的問題也是極其廣泛,庫從輕量級到重量級的都有。不少都是讓人眼界大開,亦或是望而生嘆的思維杰作。
在程序開發過程中,經常會引用第三方已經開發好的庫:(一) 盡量使用開源的第三方庫
這樣就可以拿到第三方庫的源碼,然后自己編譯,根據自己的需求。
msdn 上有這樣一段話:
警告 不要混合使用運行時庫的靜態版本和動態版本。在一個進程中有多個運行時庫副本會導致問題,因為副本中的靜態數據不與其他副本共享。鏈接器禁止在 .exe 文件內部既使用靜態版本又使用動態版本鏈接,但您仍可以使用運行時庫的兩個(或更多)副本。例如,當與用動態 (DLL) 版本的運行時庫鏈接的 .exe 文件一起使用時,用靜態(非DLL)版本的運行時庫鏈接的動態鏈接庫可能導致問題。(還應該避免在一個進程中混合使用這些庫的調試版本和非調試版本)。
(二) 直接使用第三庫,需要弄清依賴關系
如果直接使用一些比較成熟庫,我建議使用一些工具,比如說使用depends查看一下這個第三方庫還依賴于哪些庫。
比如,有的庫還是依賴于msvcp等幾個dll,這樣對于沒有安裝過VS等編譯器的計算機就無法運行您的程序。
另外,附上一些C++開源庫:
1. Boost C++標準委員會庫工作組成員發起,在C++社區中影響甚大,其成員已近2000人。 Boost庫為我們帶來了、酷、實用的技術,是不折不扣的“準”標準庫。Boost中比較有名氣的有這么幾個庫:
Regex
正則表達式庫
Spirit
LL parser framework,用C++代碼直接表達EBNF
Graph
圖組件和算法
Lambda
在調用的地方定義短小匿名的函數對象,很實用的functional功能
concept check
檢查泛型編程中的concept
Mpl
用模板實現的元編程框架
Thread
可移植的C++多線程庫
Python
把C++類和函數映射到Python之中
Pool
內存池管理
smart_ptr
2.pthread windows下的posix線程實現
3.libcurl 一個有名的開源網絡爬蟲庫 阿里旺旺中使用到了
4.libeay32 OpenSSL Library
5.libtidy 一個專門解析htm的庫
6.zlib 這個鬼都知道
7.freetype c接口的type2字體處理庫
8.libmad 一個編解碼mp3的庫
9.libogg,等 一個編解碼ogg音頻格式的庫
10.libsnd 一個開源的編解碼十多種音頻格式的庫
11.ffmpeg 一個關于音頻視頻處理的庫
12.Freeimage,Cximage,Devil 這3個都是用來處理圖形的庫
13.libpng,libjpeg,….基本同上
14.angelscript 一個類似lua的腳本引擎 其腳本風格類似于標準c語言
15.flac/flac++一個編解碼flac音頻格式的庫
16.tinyxml,rapidxml,libxml 都是關于xml解析方面的
17.luaplus,luabind都是涉及綁定lua和c++的庫
18.ode,bullet 開源的物理引擎庫
19.timidity一個可以把mid音頻格式轉化為wav格式的庫
20.vlc一個類似ffmeg的庫
21.zthread一個類型boost-thread,pthread的c++風格的多線程庫
22.sigc++,sigslot信號插槽庫 類型的有boost中的signal
23.SDL 簡單的音頻視頻庫
24.hge一個簡單的使用ddraw的2維游戲小引擎
25.opencv一個開源的處理圖形的庫
26.mygui,cegui 都是游戲上使用的GUI系統
27.鬼火游戲引擎,Orge,都是開源的游戲中間件
28.Wxwidget一個開源的跨平臺,類似MFC
29.QT Qt是Trolltech公司的一個多平臺的C++圖形用戶界面應用程序框架。它提供給應用程序開發者建立藝術級的圖形用戶界面所需的所用功能。Qt是完全面向對象的很容易擴展,并且允許真正地組件編程。自從1996年早些時候,Qt進入商業領域,它已經成為全世界范圍內數千種成功的應用程序的基礎。Qt也是流行的Linux桌面環境KDE 的基礎,同時它還支持Windows、Macintosh、Unix/X11等多種平臺。
30.loki一個實驗性質的c++庫
31.ace一個網絡通信庫
32.fmod一個有點名氣的游戲音效引擎
33.sqlite 一個開源的桌面數據庫
34.大名鼎鼎的微軟基礎類庫(Microsoft Foundation Class)。大凡學過VC++的人都應該知道這個庫。雖然從技術角度講,MFC是不大漂亮的,但是它構建于Windows API 之上,能夠使程序員的工作更容易,編程效率高,減少了大量在建立 Windows 程序時必須編寫的代碼,同時它還提供了所有一般 C++ 編程的優點,例如繼承和封裝。
35.WTL 基于ATL的一個庫。因為使用了大量ATL的輕量級手法,模板等技術,在代碼尺寸,以及速度優化方面做得非常到位。主要面向的使用群體是開發COM輕量級供網絡下載的可視化控件的開發者。
36.GTK GTK是一個大名鼎鼎的C的開源GUI庫。在Linux世界中有Gnome這樣的殺手應用。而GTK就是這個庫的C++封裝版本。
37.網絡通信 ACE庫 C++庫的代表,超重量級的網絡通信開發框架。ACE自適配通信環境(Adaptive Communication Environment)是可以自由使用、開放源代碼的面向對象框架,在其中實現了許多用于并發通信軟件的核心模式。ACE提供了一組豐富的可復用C++包裝外觀(Wrapper Facade)和框架組件,可跨越多種平臺完成通用的通信軟件任務,其中包括:事件多路分離和事件處理器分派、信號處理、服務初始化、進程間通信、共享內存管理、消息路由、分布式服務動態(重)配置、并發執行和同步,等等。
38. StreamModule 設計用于簡化編寫分布式程序的庫。嘗試著使得編寫處理異步行為的程序更容易,而不是用同步的外殼包起異步的本質。
39. SimpleSocket 這個類庫讓編寫基于socket的客戶/服務器程序更加容易。
40. Blitz++是一個高效率的數值計算函數庫,它的設計目的是希望建立一套既具像C++ 一樣方便,同時又比Fortran速度更快的數值計算環境。通常,用C++所寫出的數值程序,比 Fortran慢20%左右,因此Blitz++正是要改掉這個缺點。方法是利用C++的template技術,程序執行甚至可以比Fortran更快。Blitz++目前仍在發展中,對于常見的SVD,FFTs,QMRES等常見的線性代數方法并不提供,不過使用者可以很容易地利用Blitz++所提供的函數來構建。