4

将使用 VS 2005 编译的静态库 (.lib) 与使用 VS 2008 编译的程序链接是否正确?库和我的程序都是用 C++ 编写的。该程序在 Windows Mobile 6 Professional 模拟器上运行。

这似乎有效,没有链接错误。但是程序在启动过程中崩溃,因为链接库中发生了奇怪的事情。例如,lib 可以返回一个大小为大负数的字符向量。

用 VS 2005 编译程序就没有这样的问题了。

更奇怪的是,问题仅在使用发布配置进行构建时。使用调试配置编译时不会出现问题。

4

3 回答 3

12

VS2005 和 VS2008 使用不同的 STL 实现。当 VS2005 代码返回一个向量时,该对象的内存布局与 VS2008 所期望的不同。这应该是您在返回日期中看到的损坏值的原因。

根据经验,您应该始终使用相同的编译器编译项目的所有 C++ 模块,并且所有设置/#defines 都相等。

导致类似行为的一个特定 #define 是 VS2008 的 SECURE_SCL #define。使用不同设置编译的两个模块将完全产生您的问题,因为#defining SECURE_SCL 为各种 C++ 库类引入了更多成员变量。

于 2008-09-08T10:24:23.363 回答
2

以您描述的方式链接到较旧的库并没有错,但是您看到一些奇怪的行为并不让我感到惊讶。夫妻理智检查:

  • 两个文件是否使用相同版本相同运行时库
  • 您的 .EXE 应用程序是否“看到”与构建 .LIB 相同的头文件?确保正确声明了 _WIN32_WINNT(等)宏。

当您说 .LIB 时,您是指真正的静态库 (mylib.lib) 还是 DLL 的导入库 (mylib.lib -> mylib.dll)?

您的 VS2008 可执行项目的编译/链接设置是什么?

于 2008-09-08T09:52:32.707 回答
0

另外:正如Timbo 所指出的,VS 2005 和 VS 2008 使用不同的 STL 实现。但是,如果安装了 VS 2005,您也可以使用 VS 2008 来构建旧 STL:

  1. 在 VS 2008 中打开你的库项目。

  2. 转到工具 > 选项 > 项目和解决方案 > VC++ 目录

  3. 在顶部的下拉列表中选择您的设备平台。

  4. 将路径从 VS9 更改为 VS8 文件夹。

这样,您可以使用 VS 2008 构建库以用于 VS 2005。(为我工作。)

于 2020-03-13T13:23:51.383 回答