visual studio 2008 -我应该为c++库使用哪些优化设置

visual studio 2008 - What optimization settings should I use for a C++ library

本文关键字:优化设置 c++ 2008 studio 我应该 visual      更新时间:2023-10-16

我想写一个(静态)库供其他程序员使用,使用编译器的优化。

当我使用调试版本编写和测试库时,我发现它运行得很慢,但如果我切换到发布版本,那么它似乎可以接受的快。

此刻,我已经编译了库作为一个调试构建,我在另一个项目中使用它,我注意到它运行得有多慢,但如果我试图将我的新项目切换到一个发布构建,那么链接失败了,有很多这样的错误:

LIBCMTD.lib(tzset.obj): error LNK2005: __tzset已经在MSVCRT.lib(MSVCR90.dll)中定义

在构建我的库时,我应该使用什么设置,以便程序员可以在他们自己的项目中使用库,以便无论他们使用调试还是发布构建,它都可以快速运行?

这是静态库的老问题:它必须使用链接到它的可执行文件的同一个CRT,否则链接器会发现相同的CRT例程和数据结构(公共的和内部的)的冲突版本。

因为目前有4个版本的CRT(所有的调试/发布和dll/静态链接组合),你应该提供4个不同的.lib文件的库。顺便说一句,这就是为什么几乎没有人以.lib形式发布静态库(除非它们只是导入库),而是以库用户喜欢的任何方式提供要编译的源代码的原因之一。

如果你不喜欢这样,你应该考虑将你的库作为dll分发。在最后一种情况下,你仍然必须小心CRT,因为如果dll和使用它的程序不共享相同的CRT(例如其中一个使用静态链接版本的CRT,或者它们使用不同版本的动态链接CRT),你不能依赖几个c++工具来正确工作;最明显的问题是,你不能delete的东西被分配与new由其他模块,因为两个crt使用两个分离的堆。

同样,试图在模块之间传递c++库中定义的类型可能会导致问题,因为没有什么能保证它们在不同的CRT版本之间是二进制兼容的(通常它们不会)。如果不匹配crt, RTTI和异常也是有问题的区域。

长话短说:对于静态库,必须匹配crt,否则各个模块不会链接在一起。使用dll,正确匹配crt,一切都应该正常工作。否则,唯一明智的选择是提供c风格的接口,并让每个模块管理其内存分配(可能导出其malloc/free以让其他模块从模块的堆中分配/释放内存)。

您必须同时发布调试和发布版本。如果您希望在一个库中使用调试代码,那么您就不能发布一个库以同时在调试和发布模式下使用。