visual studio 2008 -我应该为c++库使用哪些优化设置
visual studio 2008 - What optimization settings should I use for a C++ library
我想写一个(静态)库供其他程序员使用,使用编译器的优化。
当我使用调试版本编写和测试库时,我发现它运行得很慢,但如果我切换到发布版本,那么它似乎可以接受的快。
此刻,我已经编译了库作为一个调试构建,我在另一个项目中使用它,我注意到它运行得有多慢,但如果我试图将我的新项目切换到一个发布构建,那么链接失败了,有很多这样的错误:
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
以让其他模块从模块的堆中分配/释放内存)。
您必须同时发布调试和发布版本。如果您希望在一个库中使用调试代码,那么您就不能发布一个库以同时在调试和发布模式下使用。
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 在C++/Linux中设置单调时钟的一些技巧
- 空基优化子对象的地址
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 嵌套在类中时无法设置成员数据
- 需要帮助设置在C++中使用的Potrace
- 如何在自删除后将对象设置为nullptr
- 将指针设置为"nullptr"并不能防止双重删除?
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 如何优化标准::设置交集算法(C++)
- 英特尔顾问优化标志和设置
- char*与上一条指令中设置的值的比较未优化
- 通过CMAKE在Visual Studio中设置优化设置
- 如何在gcc中设置模板功能的自动优化代码
- 如何有条件地为模板标头设置编译器优化
- 如果我设置优化 -O3,C++整个程序优化是否在 gcc 中完成
- 优化了数组元素的计算和设置
- 涉及Bool设置的c++优化
- visual studio 2008 -我应该为c++库使用哪些优化设置
- 如何在使用 phpize 构建 PHP 扩展时设置构建优化级别