c++, DLL, std::string, STL, crt
这里有非常详细的一篇
讨论仅供参考
也有可能是一个
已知的微软实现问题
最近在重构项目时遇到的一个问题:提取了原来项目中的一些公共方法到一个新的DLL,暴露的工具方法中多数以const std::string& 为参数。在调试时发现当主程序(exe)调用DLL中的这些工具方法时传入的string会发生莫名其妙的变化(不是encoding问题)。比如在主程序中的string的buffer地址为0x0118cd8,可是刚刚进入工具方法(const std::string&)这个string的内容就变了,而且buffer地址也发生了变化,根据观察只有几个字节的偏移。开发环境为VC2008。
排除过程
首先检查了C++的Runtime library,确定都是/MD,另外调整了两个工程的其它编译,连接选项到一致,问题依旧。最后在编译命令行中(Command Line)发现了一个可疑点,_DEBUG预编译项。可是我明明用的是/MD(Multithreaded DLL),不是/MDd(debug),为什么会有_DEBUG呢?为了验证猜测,使用“Undefine Preprocessor Definitions”取消了_DEBUG定义,问题解决!
其实问题的根源在于我这个调试用的Build Configuration,是基于默认的Debug创建的,这样,VS或默认为你加上_DEBUG定义,而我们这个项目原来的工程的debug环境都是基于Release配置创建的build configuration。其实不仅是string,STL中的很多类型(不敢说全部)都存在这样的问题。
总结
1. 为了保证程序行为的一致性,DLL与主程序的runtime library最好完全一致,否则便可能引入各种链接和运行时错误。
2. DLL的接口方法好暴露C式的方法签名,这样一方面可以提高LIB的可用性,还能杜绝STL对象的这种问题。
3. 错误的排除可以从编译器和链接器的的command line参数入手
4. 在为项目添加新的工程时尤其需要注意
分享到:
相关推荐
STL解决排队问题STL解决排队问题STL解决排队问题STL解决排队问题STL解决排队问题
DLL中传递STL参数,vector对象作为dll参数传递等问题 假如类A有个静态变量m_s,那么当1.exe使用了2.dll中提供的某个A对象时,由于模板扩展机制,1.exe和2.dll中会分别存在自己的一份类静态变量A<int>.m_s。 这样,...
STL入门 STL入门 STL入门 STL入门 STL入门 STL入门
手工定制了一个STL格式的文件,目的是加强对STL文件格式和三角形面片数据结构的理解。还付了一个docx文档做说明。希望对您有帮助。
西门子STL间接寻址常问问题集!
利用STL解决约瑟夫问题,可以接受数据的不同存储方式,比如vector ,list 等。
vtk加载stl格式三维模型,完整代码包括所有的头文件,lib库和dll库,解析STL文件
安装视频驱动要用的!希望大家不要下载!..................
走进STL走进STL走进STL走进STL走进STL走进STL走进STL走进STL
详细解说STL 详细解说STL 详细解说STL 详细解说STL
18个STL程序带你逐步了解STL,由浅到难。
STL格式模型文件STL格式模型文件STL格式模型文件STL格式模型文件STL格式模型文件STL格式模型文件STL格式模型文件STL格式模型文件STL格式模型文件STL格式模型文件STL格式模型文件STL格式模型文件STL格式模型文件STL...
STLSTLSTLSTLSTLSTLSTLSTLSTLSTLSTLSTLSTLSTLSTLSTLSTLSTLSTLSTLSTLSTLSTLSTLSTLSTLSTLSTLSTLSTLSTLSTLSTLSTLSTLSTLSTLSTLSTLSTL
STL实践指南 STL实践指南 STL实践指南 STL实践指南
走近STL 简单的STL入门 STL用法
该资源包含侯捷的两本书《STL源码剖析》&《深入探索C++对象模型》,讲的都是底层的,讲的很深,也很难(如果你只想用STL,建议不要看这本书),第二本书讲对象讲的很好,比较难。如果想求职程序员,最好还是多啃一下...
条款29:需要一个一个字符输入时考虑使用istreambuf_iterator 算法 条款30:确保目标区间足够大 条款31:了解你的排序选择 条款32:如果你真的想删除东西的话就在类似remove的算法后接上erase 条款33:提防在...
c++ STL, stl,stl的学习c++ STL, stl,stl的学习c++ STL, stl,stl的学习c++ STL, stl,stl的学习
Effective STL Effective STL Effective STL Effective STL
在机械建模中,如果要对一个stl格式的文件,进行操作,如修改,标注,甚至是提取特征,都须要涉及到stl逆向工程。