问题似乎与我正在使用的编译器有关,虽然我对编程很新,所以我不确定如何搞砸(我在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)
答案 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}",
来转义空格。注意两个\"
。这将确保您的项目路径被""
包围,并且不会抱怨链接器错误。