本文提供有关 Visual C++ 编译器或 Visual C++ 链接器故障排除的解决方案。
适用于: Microsoft Visual C++ 2010 Express,Visual Studio
原始 KB 数: 974229
操作
调查 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
:打开 Visual Studio 命令提示符。 这安装在“开始”菜单下,在 Visual Studio Tools 子文件夹下的 Visual Studio 文件夹中。
LINK_REPRO
创建指向现有目录和空目录的环境变量,例如:SET LINK_REPRO=C:\TEMP\LINKREPRO\
从同一命令提示符运行 Visual Studio,以便共享已修改的环境副本。
打开项目并执行“全部重新生成”项目。
在生成中调用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和/或其供应商对此网站上发布的文档和相关图形中包含的信息的适用性、可靠性和准确性不作任何陈述或保证(“材料”)。 这些材料可能包括技术不准确或版式错误,随时可以不通知地进行修订。
在适用法律允许的最大范围内,Microsoft和/或其供应商否认并排除所有表示、默示或法定条件,包括包括但不限于陈述、担保或标题条件、不侵权、满意条件或质量、适销性和针对特定目的的适用性。