VS 2005和2008库链接

问题描述 投票:4回答:3

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

这似乎可行,没有链接错误。但是,由于链接库内部发生奇怪的事情,程序在启动期间崩溃。例如。 lib可以返回大负数大小的字符向量。

使用VS 2005编译程序时没有此类问题。

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

visual-studio-2008 visual-c++ visual-studio-2005 linker
3个回答
12
投票

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

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

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


2
投票

以您所描述的方式链接到较旧的库并非不正确,但这并不奇怪,您会看到一些奇怪的行为。夫妻健康检查:

  • 两个文件都使用相同运行时库相同版本吗?
  • 您的.EXE应用程序是否“看到”了针对.LIB构建的相同头文件?确保_WIN32_WINNT(等)宏为declared properly

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

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


0
投票

Addition:Timbo has pointed out一样,VS 2005和VS 2008使用不同的STL实现。但是,如果还安装了VS 2005,则可以使用VS 2008来针对旧的STL进行构建:

  1. 在VS 2008中打开您的图书馆项目。

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

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

  4. 更改从VS9到VS8文件夹的路径。

这样,您可以使用VS 2008构建与VS 2005一起使用的库。(对我有用。)

© www.soinside.com 2019 - 2024. All rights reserved.