我收到以下消息,试图编译一些简单的代码: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;
}
答案 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报告了该问题,但看起来他们尚未解决问题。