使用 C/C++ 获取错误消息 MSB6006 错误代码 2

Posted

技术标签:

【中文标题】使用 C/C++ 获取错误消息 MSB6006 错误代码 2【英文标题】:Getting error message MSB6006 error code 2 with C/C++ 【发布时间】:2019-06-05 08:06:43 【问题描述】:

我在尝试编译一些简单代码时收到以下消息:MSB6006 "CL.exe" exited with code 2

我正在努力学习 C++。我知道一些C。我理解这两种是完全不同的语言。我包含这两个标签是因为我会根据我尝试编译代码的方式得到不同的结果。

为了我自己的教育,我正在尝试编写一个词法分析器。主要问题似乎出在这个函数上:

word scan(char** source)

    word w;
    w.lexeme[0] = '\0';
    return w;

我遇到了与MSB6006: "CL.exe" exited with code 2 相同的问题,但答案不适用于我的情况。我在MSDN网站上看到error MSB6006: "CL.exe" exited with code 2这个问题指向this question他们似乎表明小问题可能会导致这个错误代码。

我有两个文件。一个是“驱动程序”,另一个是词法分析器代码。但是,如果我将所有内容都包含在一个文件中,我会得到完全相同的结果。

这是驱动程序的代码:

#include "pch.h"
#include "Cl2aDLL.h"

void Cl2a(char argv1[], char argv2[])

    char** source = NULL;
    scan(source);

这是标题的代码。我从 MSFT 网站的某个地方获得了这项技术:

#pragma once
#ifndef CL2ADLL__H__
#define CL2ADLL__H__

typedef struct 
    char* lexeme;
word;

#ifdef __cplusplus
extern "C" 
#endif

#ifdef CL2ADLL_EXPORTS
#define CL2ADLL_API __declspec(dllexport)
#else
#define CL2ADLL_API __declspec(dllimport)
#endif

    CL2ADLL_API  void Cl2a(char argv1[], char argv2[]);

    word scan(char** source);

#ifdef __cplusplus

#endif

#endif // ! CL2ADLL__H__

这是词法分析器的代码:

//  Error   MSB6006 "CL.exe" exited with code 2.

#include "pch.h"
#include "Cl2aDLL.h"

/*
//  when I comment out the following lines, it compiles and runs okay
word scan(char** source)

    word w;
    w.lexeme[0] = '\0';
    return w;

*/

//  if I only have the following, I get compile error if .cpp
word scan(char** source)


奇怪的是,如果我将编译为 C 代码,它编译并运行正常。但是,如果我尝试编译 as C++ 我会收到错误消息。如果我取消注释掉扫描仪的第一个版本,我会收到错误消息编译 as C 或 C++ 任何一个。

有人知道可以删除此错误消息的更改吗?

很抱歉这个问题太长了,但我会尽量给出问题的明确定义。因为我无法弄清楚可能出了什么问题。 TIA。

更新:我正在使用 VS 2019 社区版 16.1.1

更新 2: 我在 16.1.2 版中得到了相同的结果。但是在 VS2017 Community Edition 15.9.12 中尝试代码就出现了问题,如下图。

另外我应该解释一下以上所有代码都在一个 .dll 文件中。 .dll 代码从一个简单的控制台应用程序运行,如下所示:

#include "..\CL2aDLL\CL2aDLL.h"

int main(int argc, char* argv[])

    char        parm1[1 + 1] = "";
    char        parm2[1 + 1] = "";

    if (argc == 1) 
        Cl2aDLL(parm1, parm2);
    
    else 
        Cl2aDLL(argv[1], argv[2]);
    

    return 0;

【问题讨论】:

与您的编译器问题无关,但您显示的代码很可能无论如何都会崩溃,因为您取消引用 scan 函数中未初始化的指针。 谢谢@Some 程序员老兄。确实如此。在较长版本的程序中,我确实初始化了指针并向source 数组添加了一些数据。我只是为了提问而缩短了它。 没有 C/C++ 这样的东西。 C 和 C++ 是不同的语言,它们有一些共同的特点。 @n.m.谢谢你。我只包含了两个标签,因为我得到了不同的结果。在某些情况下,我让程序在编译为 C 代码时编译并运行。但是当编译为 C++ 时,无论如何都没有编译。 这是 VS2019 中的一个 bug,早期版本存在典型的“快速编写代码并让客户测试”敏捷 bug。现在,您需要忽略该特定消息。只需关注它报告的其他错误。修复这些错误后,MSB6006 错误也会消失。 【参考方案1】:

我做了一些额外的研究。

在 VS Community Edition 15.9.12 中运行代码显示 w.lexeme[0] = '\0'; 行试图使用未初始化的指针。

修正后的函数是:

word scan(char** source)

    word w;

    w.lexeme = (char*)malloc(1);    //  <-- line added
    w.lexeme[0] = '\0';
    return w;

这编译并运行正常。

但这仍然不能解释为什么这段代码会出现 MSB6006 错误:

word scan(char** source)


这仅在编译为 C++ 时发生。如果编译为 C,它可以编译并运行正常。

更新:我向 MSFT 报告了这个问题,但看起来他们还没有解决问题。

【讨论】:

代码在 C 和 C++ 中都有未定义的行为。未定义行为的无数种表现形式之一是代码执行程序员期望它执行的操作。 再次感谢您。未定义的行为。啊。

以上是关于使用 C/C++ 获取错误消息 MSB6006 错误代码 2的主要内容,如果未能解决你的问题,请参考以下文章

使用VS自带OpenMP时出现“错误 MSB6006 CL.exe 已退出,代码为2”

错误 MSB6006:“midl.exe”退出,代码为 2026

错误 MSB6006:“CL.exe”以代码 2 退出

当代码在 Visual Studio C++ 中正常工作时出现 MSB6006 错误

错误 MSB6006:“lc.exe”以代码 -1 退出

错误 MSB6006:启用 ProGuard 时“java.exe”以代码 1 退出