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

时间:2019-06-05 08:06:43

标签: c++ c visual-studio

我收到以下消息,试图编译一些简单的代码: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代码,它将编译并运行正常。但是,如果我尝试编译为C ++ ,则会收到错误消息。如果我取消注释扫描仪的第一个版本,则会收到错误消息,将编译为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;
}

1 个答案:

答案 0 :(得分:0)

我还做了一些其他研究。

运行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报告了该问题,但看起来他们尚未解决问题。