是否可以在 Visual Studio 2008 中使用使用 Visual Studio 6 编译的 C++ 静态库 (.lib)?
6 回答
这真的取决于。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() 的文档以获取更多信息。
我不应该想为什么不这样做——只要你保持通常的 CRT 内存边界(即,如果你在库函数中分配内存,总是从库中释放它——通过调用库中的函数来进行释放)。
这种方法适用于使用各种编译器编译的 dll,静态链接的库也应该没问题。
是的。这根本不应该有任何问题。正如gbjbaanb提到的,你需要注意你的记忆,但 VS2008 仍然可以使用它。只要您不尝试将 CLR、(托管)代码与它混合。如果可能的话,我建议不要这样做。但是,如果您谈论的是原始 C 或 C++ 代码,那当然可以。
你到底打算用什么?(这个库中有什么?)您是否已经尝试过,但遇到了问题,或者您只是在浪费大量时间试图让某些无法正常工作的东西之前进行检查?
肯定会奏效的。
您是在问在 VS2008 中的何处对引用进行编码吗?
如果是这样,请转到 proj props -> Linker -> Input on Configuration properties on the property pages。查找“附加依赖项”并在那里编写 .LIB 代码。
转到 proj props -> Linker -> General 并在“附加库目录”中对库路径进行编码。
应该这样做!!
在某些情况下,答案是否定的,当我们从 VS6 迁移到 VS2k5 时,我们必须重建所有库,因为内存模型已经改变,CRT 功能也不同。