Microsoft Visual C++ 编译器或 Visual C++ 链接器故障排除

本文提供有关 Visual C++ 编译器或 Visual C++ 链接器故障排除的解决方案。

适用于: Microsoft Visual C++ 2010 Express, Visual Studio
原始 KB 数: 974229

Action

调查 Microsoft Visual C++ 编译器或链接器可能存在的问题时,获取有关生成过程和所用选项的尽可能多的信息非常重要。 本文讨论了一些故障排除提示,这些提示可以帮助解决构建问题或捕获 Microsoft 支持所需的全面信息。

决议

  • 编译器问题

    对于编译器问题,例如内部编译器错误(如 C1001)、挂起或崩溃,捕获 C/C++ 预处理器的输出以便提供简化的可重现问题示例是非常有用的。 在 Visual C++ IDE 中,可以通过将 “生成预处理的文件 ”属性设置为 “行号”(/P)“无行号”(/EP /P)来完成此作。 可以在“配置属性”、“C/C++”、“预处理器设置”下的“项目属性”页下找到此属性。

    可以在项目级别设置此设置,在这种情况下,它将为项目中的所有源文件生成 .i 文件,也可以通过右键单击解决方案资源管理器中的文件,选择“属性”上下文菜单来显示单个文件的属性对话框,从而为单个文件设置此设置。

    /P 编译器开关指示CL.EXE将预处理器输出捕获到文件。 添加 /EP 将禁止向生成的文件添加行号信息。 /P 已足够,但 /EP /P 将生成较小的输出文件。 生成的预处理器输出文件的名称将与正在编译的源文件同名,但扩展名为 a.i,例如,file1.cpp在同一目录中生成 file1.i 预处理器输出文件。

    注释

    切换此选项时,编译将超出预处理器阶段,也就是说,编译器不会生成 .OBJ 文件,你可能会收到一个链接错误,显示 OBJ 文件无法找到的错误。

    可以在 Visual Studio 项目的上下文之外自行编译预处理器输出文件。 该文件 .i 包含编译该特定 .C 文件或 .CPP 源文件所需的所有头文件代码、宏替换和预处理的编译器指令信息。 换句话说,它是一个自包含模块,它应该能够重现编译问题,而不依赖于其他文件。 生成的文件通常很大,并且包含大量的空白。

  • 链接问题

    对于链接器问题(LNKxxxx 类型错误),可以使用 /LINKREPRO 链接器命令行开关生成仅包含链接器输入的测试用例,而无需依赖于源文件。 /LINKREPRO 使用以下语法:

    /LINKREPRO:<path>

    '<path>' 是本地文件系统上空文件夹的完整路径。 此文件夹必须已存在 - 链接器不会自动创建它,如果文件夹不存在,将生成错误。

    此选项不会在项目系统中直接公开。 若要将其添加到生成,请从“项目”菜单中打开“项目属性”菜单。 在 配置属性链接器命令行“其他选项 ”编辑框中,输入 /LINKREPRO:<path> 开关(包括正斜杠),并将路径替换为预先存在的本地文件夹路径。 例如: /LINKREPRO:C:\TEMP\LINKREPRO\

    如果此编辑框中已有其他链接器选项,请用逗号分隔它们。

    或者,可以使用 LINK_REPRO 环境变量。 LINK_REPRO如果环境变量存在,链接器将从环境变量读取输出路径并生成 linkrepro。 使用 LINK_REPRO 环境变量时不需要 /LINKREPRO 开关。 若要使用LINK_REPRO环境变量,请执行以下操作:

    1. 打开 Visual Studio 命令提示符。 这安装在 “开始 ”菜单下,在 Visual Studio Tools 子文件夹下的 Visual Studio 文件夹中。

    2. LINK_REPRO创建指向现有目录和空目录的环境变量,例如: SET LINK_REPRO=C:\TEMP\LINKREPRO\

    3. 从同一命令提示符运行 Visual Studio,以便共享已修改的环境副本。

    4. 打开项目并对项目执行“全部重新生成”操作。

    在构建过程中调用 LINK.EXE 时,它会复制链接项目到 linkrepro 目录所需的全部内容。 复制的文件包括你的对象文件(。OBJ),所需的库文件(。LIB),包括Microsoft库和链接器响应文件(LINK。RSP),使 LINK 不再依赖于解决方案文件。

    若要确认你拥有重现链接问题所需的所有文件,可以使用 linkrepro 生成的链接器响应文件,在由LINK_REPRO环境变量指定的目录中运行 LINK: LINK @link.rsp

    执行此作之前,请使用以下命令关闭此功能(如果使用命令行环境变量): SET LINK_REPRO=

    使用 LIB.EXE 或 LINK /LIB 时,还可以使用此过程来验证创建库所涉及的文件。

免责声明

快速发布免责声明

快速发布文章直接提供来自微软支持组织的信息。 本文中包含的信息是针对新兴或独特的主题创建的,或旨在补充其他知识库信息。

免责声明

MICROSOFT和/或其供应商对网站(“材料”)上发布的文档和相关图形中包含的信息的适用性、可靠性或准确性没有任何陈述或保证。 材料可能包括技术不准确或版式错误,随时可以不通知地进行修订。

在适用法律允许的最大范围内,MICROSOFT和/或其供应商声明不承担责任,并排除所有明示、暗示或法定的声明、担保和条件,包括但不限于所有权、不侵权、令人满意的状况或质量、适销性和特定用途的适用性。