C ++无法编译简单的类头(链接器命令失败,退出代码为1)

时间:2018-03-19 22:29:37

标签: 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::Stickman(){
    cout << "Hello\n";
}

这是我的主要内容:

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

int main(){
   Stickman figure;
}

这是终端中的ERROR消息:

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)

3 个答案:

答案 0 :(得分:1)

你需要改为调用它:

g++ main.cpp stickman.cpp -o main

也会编译stickman.cpp。然后链接器将知道该怎么做。现在你的main中有一个#include stickman.h声明了类,但没有定义它。

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

答案 1 :(得分:0)

它必须是特定于编译器的,因为我在Visual Studio中运行代码并且它已成功构建。如果您碰巧拥有Windows计算机,我建议您获得免费的Express /社区Visual Studio 2017 IDE软件。代码看起来很好,所以我个人不确定如果它与编译器无关,可能会导致你的问题。如果你只有一台Mac电脑,那么我建议你可以查看其他免费的编译器。

答案 2 :(得分:0)

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

例如在vscode中执行此操作macOS Catalina,请在这里https://stackoverflow.com/a/61331301/1071899

查看我的回答

基本上,您需要使用特定于编译器的标志制作一个task.json文件。在这里,您需要包括所有* .cpp文件都应编译,并且需要通过添加"\"${workspaceFolder}\"/*.cpp",而不是"${file}",来转义空格。注意两个\"。这将确保您的项目路径被""包围,并且不会抱怨链接器错误。