gpt4 book ai didi

c++ - 如何在不需要 LIBCD.lib 的情况下在 Visual Studio 6 中编译 C 项目?

转载 作者:行者123 更新时间:2023-12-02 10:14:49 26 4
gpt4 key购买 nike

我已经将 VolPack ( https://graphics.stanford.edu/software/volpack/ ) 编译为 Visual Studio 6(在 Windows XP 下)中的静态库,因为我认为这就是它的用途,并且它不会在 Visual Studio 2019 下编译。但是尝试编写 C++ 程序在 Visual Studio 2019 中并链接到 volpack.lib 我收到错误:错误 LNK1104 无法打开文件“LIBCD.lib”

(我不认为这是 VolPack 特有的错误,我认为它适用于在 VC 6 下编译的任何库,然后链接到更高版本的 VS,所以我认为这个问题对于 StackOverflow 来说不是太具体。)

我发现了这个:https://support.microsoft.com/en-us/help/154753/description-of-the-default-c-and-c-libraries-that-a-program-will-link ,这解释了为什么它使用该库,但我不知道在 VS 6 中如何处理它。我没有看到有关多线程的选项可以更改以使其使用不同的库,并且快速的 Google 搜索显示VS 6 不支持多线程。

我确实找到了这个:How to solve "cannot open file 'LIBCD.lib' " in visual studio 2008? ,但我不确定该解决方案是否与我的问题相关,因为字符串“GLUI”在我尝试链接的库中无处出现。即使它是我问题的解决方案,我也不知道从哪里获得 GLUI 的源代码,我需要对 makefile 进行哪些更改,或者如何让 VS 6 使用新的重新编译的 GLUI,无论是什么.

下一个解决方案基本上是告诉链接器忽略 LIBCD.lib,但这给了我其他错误。我发现了这个:https://www.youtube.com/watch?v=zKrggjsgQx4 ,它基本上是说忽略 LIBCD.lib 然后将运行时库更改为多线程调试,但这也给了我错误。

尝试在 VS 2019 下编译 VolPack 时遇到的错误都是“潜在的未初始化的局部指针变量”,因此可能需要进行一些简单的修改才能使其在 VS 2019 下编译,但我不是 C 方面的专家,我也不知道不想处理试图弄清楚如何修改程序和可能破坏它的头痛。因此,任何人都知道解决该问题的简单方法也可能奏效。谢谢。

最佳答案

当您使用依赖于其他库的静态库时,编译器会提示如果找不到其他库。

Microsoft Visual Studio 6.x 和 Visual Studio 2019 之间的差异是巨大的。由于我已将旧代码(C 和 C++)从 6.x 移植到 VS 2015,由于 Microsoft 在遵守标准方面的改进,我不得不进行大量源代码更改以允许编译工作作为支持标准的新版本,其中一些不赞成以前支持的结构。

请参阅有关版本之间兼容性的帖子,Library ABI compatibility between versions of Visual Studio
另见:

Binary compatibility between VS2017 and VS2015

ABI-Compatibility of visual studio c-libraries

还有这个 blog posting from Microsoft about the release of Visual Studio 2019日期为 2019 年 说:

Visual Studio 2019 version 16.0 is now available and is binary compatible with VS 2015/2017. In this first release of VS 2019, we’ve implemented more compiler and library features from the C++20 Working Paper, implemented more overloads (C++17’s “final boss”), and fixed many correctness, performance, and throughput issues. Here’s a list of the C++17/20 compiler/library feature work and the library fixes. (As usual, many compiler bugs were also fixed, but they aren’t listed here; compiler fixes tend to be specific to certain arcane code patterns. We recently blogged about compiler optimization and build throughput improvements in VS 2019, and we maintain a documentation page about compiler conformance improvements in VS 2019.)



除了使用源代码使其与 Visual Studio 2019 兼容之外,我看不到任何其他资源。如果您仔细观察,您可能会发现您在 C 方面的专业知识水平足以实现以下一些建议。

最好的做法似乎是对库进行必要的源代码更改,以便它可以在 Visual Studio 2019 下正确编译。

最好的做法是在每个发现未初始化指针错误的地方查看源代码并更正源代码,以便不再产生错误。以前在这些代码领域工作的程序员显然遗漏了潜在的控制流,这可能是因为他们期望基于函数将如何使用的假设永远不会执行丢失的代码。很可能任何此类功能都很复杂,可能需要重构。

我经常看到这种类型的缺失流是由于 switch 造成的。声明缺少 default:捕获事件 switch变量不是指定的 case 值之一。也可能是由于 if声明是一系列 else if没有最后 else捕获任何其他可能的条件。或者也可能是由于具有 break 的循环所致。指针变量初始化之前的语句或使用 continue 的语句语句跳过变量的初始化位置。

在大多数情况下,这些问题是由于低内聚性和/或过于复杂和庞大的功能造成的,随着时间的推移,维护操作会引入这些类型的问题。

对于可能未初始化的指针的错误,一个不太理想的做法是仅使用一些适当的值进行初始化。可以跳转到出错的地方,点击变量,到定义的地方,然后设置一个合适的值。在大多数情况下,值为 NULL for 指针是最安全的,因为如果它保持不变 NULL并且在未修改为正确值的情况下使用,您的应用程序应该崩溃,让您知道存在问题。

通过初始化为 NULL您假设以前的程序员知道他们在做什么,并且由于逻辑原因,编译器检测到的可能使变量保持不变为正确值的可能流永远不会发生。

如果发生未初始化的指针流,您会发现应用程序何时崩溃。不幸的是,追溯崩溃的起源可能很困难。

您可以使用 assert和代码中的其他测试来创建断点,如果您正在调试或生成异常,如果它是 C++,这可能比仅仅崩溃提供更多信息。因此,在生成错误的源代码行之前添加这样一个测试,检查 NULL在测试之前使用指针可能会有所帮助。

或者,如果该函数具有指示它是否工作的状态代码以及任何错误以及返回错误状态的某种方式,那么最有效的方法是在生成潜在未初始化指针错误的指针处使用该错误报告如果健全性检查失败。

但是,如果您可以辨别出一个安全的默认值,您可能想改用它。辨别安全值需要查看源代码以确定安全默认值应该是什么。有时,这样的安全值可以是初始化为零的适当类型的变量的地址。

警告:如果返回的是指针中的地址,则不要使用函数局部变量的地址。当函数返回该地址将不再有效导致未定义行为。

警告 2:如果指针中的地址预计已使用 malloc() 分配或 new或类似的内存分配器,那么您必须使用相同的机制,以便当某些代码决定使用 free() 释放内存时或 delete然后它会起作用。

如果指针的值本地化为函数本身,则此审查将需要阅读使用未初始化指针的函数的源代码。如果函数返回指针,即函数导出给函数用户的值,那么您还需要查看使用该函数的源代码,以确定适当的默认值。

所以我建议你做的是,在你进行初始化的每个地方,你添加一个唯一的标识注释(类似于“Inhahe fix uninitialized pointer error 06/10/2020”)到该行,这样你就可以做稍后搜索以找到这些,然后返回到有问题的代码中,并通过重构或更改代码以消除可能的未初始化指针错误来实际修复编译器错误。

在你做任何事情之前,让源代码处于某种版本控制之下。

关于c++ - 如何在不需要 LIBCD.lib 的情况下在 Visual Studio 6 中编译 C 项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62313707/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com