将使用 VS 2005 编译的静态库 (.lib) 与使用 VS 2008 编译的程序链接是否正确?库和我的程序都是用 C++ 编写的。该程序在 Windows Mobile 6 Professional 模拟器上运行。
这似乎有效,没有链接错误。但是程序在启动过程中崩溃,因为链接库中发生了奇怪的事情。例如,lib 可以返回一个大小为大负数的字符向量。
用 VS 2005 编译程序就没有这样的问题了。
更奇怪的是,问题仅在使用发布配置进行构建时。使用调试配置编译时不会出现问题。
将使用 VS 2005 编译的静态库 (.lib) 与使用 VS 2008 编译的程序链接是否正确?库和我的程序都是用 C++ 编写的。该程序在 Windows Mobile 6 Professional 模拟器上运行。
这似乎有效,没有链接错误。但是程序在启动过程中崩溃,因为链接库中发生了奇怪的事情。例如,lib 可以返回一个大小为大负数的字符向量。
用 VS 2005 编译程序就没有这样的问题了。
更奇怪的是,问题仅在使用发布配置进行构建时。使用调试配置编译时不会出现问题。
VS2005 和 VS2008 使用不同的 STL 实现。当 VS2005 代码返回一个向量时,该对象的内存布局与 VS2008 所期望的不同。这应该是您在返回日期中看到的损坏值的原因。
根据经验,您应该始终使用相同的编译器编译项目的所有 C++ 模块,并且所有设置/#defines 都相等。
导致类似行为的一个特定 #define 是 VS2008 的 SECURE_SCL #define。使用不同设置编译的两个模块将完全产生您的问题,因为#defining SECURE_SCL 为各种 C++ 库类引入了更多成员变量。
以您描述的方式链接到较旧的库并没有错,但是您看到一些奇怪的行为并不让我感到惊讶。夫妻理智检查:
当您说 .LIB 时,您是指真正的静态库 (mylib.lib) 还是 DLL 的导入库 (mylib.lib -> mylib.dll)?
您的 VS2008 可执行项目的编译/链接设置是什么?
另外:正如Timbo 所指出的,VS 2005 和 VS 2008 使用不同的 STL 实现。但是,如果安装了 VS 2005,您也可以使用 VS 2008 来构建旧 STL:
在 VS 2008 中打开你的库项目。
转到工具 > 选项 > 项目和解决方案 > VC++ 目录
在顶部的下拉列表中选择您的设备平台。
将路径从 VS9 更改为 VS8 文件夹。
这样,您可以使用 VS 2008 构建库以用于 VS 2005。(为我工作。)