2010-08-17 27 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