2010-08-17 53 views
1

我在Microsoft Visual Studio 2008 SP1中構建靜態庫(現在爲libpng)。C++ - 構建庫

我是否有任何可能建立兩個DebugRelease模式假設我的庫只有C代碼在其單庫(一個文件)?

至於我記得,gtkmm,例如,有它的預建的包,其中基於C++庫出貨都DebugRelease版本,但其他的 - 因爲只有一個單一的文件。

E.g.它們具有用於基於C++的庫的gtkmm-vc90-d-2_4.libgtkmm-vc90-2_4.lib文件,並且它們具有單個庫,例如用於DebugRelease配置的gtk-win32-2.0.lib

如何才能達到相同的效果?我該怎麼做才能使構建的庫(純C)配置無關?

回答

1

從理論上講,你可以建立只有一個庫如果所有的外部頭的庫(即客戶端被拉進的)沒有的#ifdef _DEBUG使用(或可以定義任何其它宏在調試版本,但沒有一個發佈版本

考慮這樣的情況:

// file: mylib.h 
struct A { 
    int member1; 
    int member2; 
    #ifdef _DEBUG 
    int extraDebugOption; 
    #endif 
}; 

在這種情況下,如果你到圖書館鏈接到您自己的產品的調試版本那麼A將有與發佈版本不同的大小,這意味着你將要h一些相當可怕的內存腐敗錯誤追蹤(在那裏...)。忘了提及,你應該使你的一個配置成爲一個發佈配置,這樣你不會結束任何對調試CRT的引用,並且庫也被優化了。正如lsalamon指出的那樣,創建一個pdb文件並將其與.lib文件一起保存將在未來用於調試。

+1

在我的'Release'應用程序中使用庫構建爲'Debug'時應該如何處理'/ NODEFAULTLIB'警告? – 2010-08-17 20:50:54

+0

可能最安全的方法是靜態鏈接發佈運行時。 – 2010-08-17 22:13:51

1

以包括髮行版本的調試信息使用此配置:
C/C++ - >常規 - >調試信息格式:程序數據庫(/ ZI)

連接器 - > Debugging->生成調試信息:是(/ DEBUG)

+0

這些設置是'vc90'的默認設置,據我所知。 – 2010-08-17 21:03:12

+0

對於發佈配置呢? (因爲OP應該可以有效地構建這個庫的發佈配置) – 2010-08-17 22:14:30