我可以在 Visual Studio 2008 中使用 Visual Studio 6 编译的 C++ 静态库吗?
Posted
技术标签:
【中文标题】我可以在 Visual Studio 2008 中使用 Visual Studio 6 编译的 C++ 静态库吗?【英文标题】:Can I use a Visual Studio 6 compiled C++ static library in Visual Studio 2008? 【发布时间】:2009-04-06 21:59:04 【问题描述】:是否可以在 Visual Studio 2008 中使用使用 Visual Studio 6 编译的 C++ 静态库 (.lib)?
【问题讨论】:
我假设您问的是是否可以在 VS2008 中将它与 C++ 一起使用,而不是您是否可以从 C# 或 VB.NET 等托管语言中调用它?如果是后者,请编辑您的问题以使其更清晰。 【参考方案1】:这真的取决于。 lib是否只公开'extern“C”'函数,其中内存由直接的Win32方法(CoTaskMemAlloc等)管理,或者调用者永远不会释放被调用者分配的内存,反之亦然?您是否只依赖自 VS 6 以来没有太大变化的基本库?如果是这样,你应该没问题。
有 2 件基本的事情需要注意。更改第 3 方库使用的全局变量,以及更改这些第 3 方库定义的结构、类等结构。例如,CRT 内存分配器可能在两个版本之间更改了其隐藏的分配管理结构,因此让一个版本的库分配一块内存而让另一个版本释放它可能会导致崩溃。
作为另一个例子,如果你通过接口公开 C++ 类并且它们依赖于 MFC 等 MS 运行时库,则类布局可能在 VS 6 和 VS 2008 之间发生了变化。这意味着访问成员/字段课程可能会做错事并导致不可预测的结果。如果 .lib 以任何方式使用 MFC,您可能会感到厌烦。 MFC 定义并在内部使用大量全局变量,如果 MFC 基础结构在托管环境中发生变化(自 VS 6 以来发生了很大变化,顺便说一句),通过 .lib 中的操作对 MFC 全局变量的任何访问都可能导致失败。
我还没有详细研究 MFC 标头中发生了哪些变化,但我已经看到在不同 VS 版本中编译的基于 MFC/ATL 的类二进制文件之间存在不可预知的行为。
除了这些问题之外,像 strtok() 这样依赖于运行时库中定义的静态全局变量的函数还存在风险。我不确定,但我担心如果您在多线程 CRT 上创建的线程上使用期望单线程 CRT 的客户端,这些静态变量可能无法正确初始化。查看 _beginthread() 的文档了解更多信息。
【讨论】:
【参考方案2】:我不应该想为什么不 - 只要你保持通常的 CRT 内存边界(即,如果你在库函数中分配内存,总是从库中释放它 - 通过调用库中的函数来执行释放)。
这种方法适用于使用各种编译器编译的 dll,静态链接的库也应该没问题。
【讨论】:
【参考方案3】:是的。这根本不应该有任何问题。正如gbjbaanb 提到的,你需要记住你的记忆,但是VS2008 仍然可以使用它。只要您不尝试将 CLR、(托管)代码与它混合。如果可能的话,我建议不要这样做。但是,如果您谈论的是原始 C 或 C++ 代码,那当然可以。
您到底打算使用什么? (这个库中有什么?)您是否已经尝试过,但遇到了问题,或者您只是在浪费大量时间试图让一些无法正常工作的东西之前进行检查?
【讨论】:
我只是在浪费大量时间试图让它工作之前问一下。我有一个已编译的 .lib 库,并且只有使用它所需的头文件,所以我无法重新编译整个库【参考方案4】:肯定会成功的。
你是问在 VS2008 中的什么地方对引用进行编码?
如果是这样,请转到 proj props -> Linker -> Input on Configuration properties on the property pages。查找“其他依赖项”并在那里编写 .LIB 代码。
转到 proj props -> Linker -> General 并在“Additional Library Directories”中对 libs 路径进行编码。
应该这样做!
【讨论】:
【参考方案5】:在某些情况下,答案是否定的,当我们从 VS6 迁移到 VS2k5 时,我们必须重建所有库,因为内存模型发生了变化,并且 CRT 功能也有所不同。
【讨论】:
因此我的观点是 - 如果您将所有 CRT 调用保留在库中,那么您将没有问题。即使在混合发布和调试版本之间。如果您在 lib 中调用 CRT fn,将内存传递到外部,然后让您的应用程序对其进行操作,则可能会遇到麻烦。简单的封装就是答案。 虽然我明白你对内存分配的意思,但 VS2K5 拒绝使用我们的 VS6 库。那是两年前的事了,所以它给我的确切错误我不记得了。我们必须追踪多年未重新编译的库的代码,并在 VS2K5 中重建它们。【参考方案6】:在 VC6、VS2003、VS2005 和 VS2008 之间有一些重大变化。 Visual C++(在 VS2005 中)停止支持单线程、静态链接的 CRT 库。列举了here 和here 的一些重大更改。这些更改将影响您在以后的版本中使用 VC6 构建的库。
【讨论】:
以上是关于我可以在 Visual Studio 2008 中使用 Visual Studio 6 编译的 C++ 静态库吗?的主要内容,如果未能解决你的问题,请参考以下文章
visual studio 2008 c++ 中怎样添加动态链接库?
在 Visual Studio 2008 中配置 FxCop 以运行规则子集
在 Visual Studio 2008 中打开 SDF 数据库
如何在 Visual Studio 2008 中打开使用 Visual Studio 2005 创建的 rdl?