C++ C++;Can';t编译简单类头(链接器命令失败,退出代码为1)

C++ C++;Can';t编译简单类头(链接器命令失败,退出代码为1),c++,class,linker,visual-studio-code,C++,Class,Linker,Visual Studio Code,问题似乎出在我正在使用的编译器上,尽管我对编程相当陌生,所以我不确定如何处理这个问题(我在Mac OSX上使用VSCode) 这是我的标题: #ifndef STICKMAN_H #define STICKMAN_H class Stickman{ public: Stickman(); }; #endif 这是我的源文件: #include "stickman.h" #include <iostream> using namespace std; Stickman::Sti

问题似乎出在我正在使用的编译器上,尽管我对编程相当陌生,所以我不确定如何处理这个问题(我在Mac OSX上使用VSCode)

这是我的标题:

#ifndef STICKMAN_H
#define STICKMAN_H

class Stickman{
public:
Stickman();
};
#endif
这是我的源文件:

#include "stickman.h"
#include <iostream>

using namespace std;

Stickman::Stickman(){
    cout << "Hello\n";
}

它必须是特定于编译器的,因为我在VisualStudio中运行了代码,并成功构建了它。如果您碰巧有Windows电脑,我建议您获得免费的express/community Visual Studio 2017 IDE软件。代码看起来很好,所以我个人不确定如果与编译器无关,是什么导致了您的问题。如果你只有一台Mac电脑,那么我建议你去看看其他的免费编译器。

你需要称之为:

g++ main.cpp stickman.cpp -o main
它还将编译
stickman.cpp
。然后链接器就会知道该做什么。现在,在main中有一个
#include stickman.h
,它声明了类,但没有定义它


链接器看到构造函数已声明(在
stickman.h
中),但看不到它是如何实现的(
stickman.cpp
未编译)。因此,它无法与构造函数主体链接。

如果项目的路径包含空格,则在vscode中也会收到此错误。如上所述,您还需要编译所有cpp文件

要在vscode(例如macOS Catalina)中执行此操作,请在此处查看我的答案


基本上,您需要创建一个带有编译器特定标志的tasks.json文件。在这里,您需要包括编译所有*.cpp文件,并且需要通过添加
“\”${workspaceFolder}\“/*.cpp”
而不是
“${file}”,
来转义空白。注意两个
\“
。这将确保项目路径被
包围“
并且它不会抱怨链接器错误。

您只编译了
main.cpp
您没有编译
stickman.cpp
@Raindrop7当您向
gcc
提供多个
-o
选项时,它将忽略除最后一个之外的所有选项。如果我尝试编译[main.cpp]中的任何一个,就会出现上面提到的错误。”或stickman.cpp或两者兼有。它就是不工作,但如果我在CLion中运行这段代码,它就工作得很好。另外,我应该注意,如果我删除stickman.cpp并只在标题中编写代码,它运行良好(但我被告知这不是一个好的编程实践),您的
main
的返回类型为
int
,因此请输入
return
语句。@ThomasMatthews
return 0main()
中显式添加,则暗含code>。是否添加它是程序员的选择。谢谢你的回复,我也很确定这只是VSCode编译器(我现在使用的IDE)bcs的某种问题。我在CLion上运行了它,它运行得很好,我只是碰巧更喜欢VSCode,但是我最近遇到了一些问题,这个问题让我很困惑,因为我不知道错误消息是什么意思。谢谢,这真的解决了问题。现在,我不确定你是否有VSCode方面的经验(如果没有,那很好,你可以忽略我将要说的内容),但基本上我有一个编译和运行代码的扩展(称为code runner),默认情况下它只编译main,我觉得奇怪的是,在包含其他.cpp文件的项目中,或者是写有实现代码的头文件,即使它只是编译了主文件,但一切都很好,你知道为什么会这样吗?以及如何使该扩展自动编译所需的所有内容?快速更新,我发现如果我在主文件中包含“stickman.h”和“stickman.cpp”,扩展将正确编译,但是我不确定这是否是一个好的编程原则,因为当程序变大时可能会混淆。您是否推荐这种方法,或者认为它将来可能会带来任何问题?是的,因为所有内容都是在
main.cpp
中复制/粘贴的(通过
#include
)。但要注意这种做法:谢谢,那篇文章很棒,完全理解!
Alexandres-MBP:Game alexandrecarqueja$ cd
"/Users/alexandrecarqueja/Desktop/Game/" && g++ main.cpp -o main && "/Users/alexandrecarqueja/Desktop/Game/"main
Undefined symbols for architecture x86_64:
"Stickman::Stickman()", referenced from:
 _main in main-d38641.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
g++ main.cpp stickman.cpp -o main