c++ - Mac OS - VS Code Insiders - Code Runner:架构 arm64 的未定义符号
问题描述
在过去的一周里,我一直被困在这个问题上。当我使用 VS Code Insiders - Code Runner Extension 或命令编译代码时:clang++ -std=c++14 main.cpp,它给了我以下错误:
Undefined symbols for architecture arm64:
"LinkedList::insertHead(int)", referenced from:
_main in main-6d6a24.o
"LinkedList::insertTail(int)", referenced from:
_main in main-6d6a24.o
"operator<<(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, LinkedList const&)", referenced from:
_main in main-6d6a24.o
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
但是,我能够使用下面的 Makefile 编译代码:
all: main
main: main.o linkedList.o
clang++ -std=c++14 -o $@ $^
main.o: main.cpp linkedList.h
clang++ -std=c++14 -c $<
linkedList.o: linkedList.cpp linkedList.h
clang++ -std=c++14 -c $<
clean:
rm -f main *.o
rm -f linkedList *.o
如果我将 int main() {} 放在linkedList.cpp 中,它也会起作用。我想也许有某种链接器问题?当我搜索错误时,它被提到了很多。
这是代码:main.cpp:
#include "linkedList.h"
#include <iostream>
int main() {
LinkedList l;
LinkedList l2;
for (int i = 0; i < 10; i++) {
l.insertHead(i);
}
for (int i = 0; i < 10; i++) {
l2.insertTail(i);
}
std::cout << l << std::endl;
std::cout << l2 << std::endl;
return 0;
}
链接列表.h:
#include <iostream>
struct Node {
int data;
Node *next = nullptr;
};
class LinkedList {
private:
Node *head;
Node *tail;
void inserFirst(int);
Node *createNode(int);
public:
void insertHead(int);
void insertTail(int);
friend std::ostream &operator<<(std::ostream &out, const LinkedList &list);
};
链接列表.cpp:
#include "linkedList.h"
void LinkedList::inserFirst(int item) {
Node *n = createNode(item);
head = n;
tail = n;
}
Node* LinkedList::createNode(int item) {
Node *n = new Node;
n->data = item;
n->next = nullptr;
return n;
}
void LinkedList::insertHead(int item) {
if (head == nullptr) {
inserFirst(item);
} else {
Node *n = createNode(item);
n->next = head;
head = n;
}
}
void LinkedList::insertTail(int item) {
if (head == nullptr) {
inserFirst(item);
} else {
Node *n = createNode(item);
tail->next = n;
tail = n;
}
}
std::ostream &operator<<(std::ostream &out, const LinkedList &list) {
Node *n = list.head;
while (n != nullptr) {
out << n->data;
n = n->next;
}
return out;
}
让我困惑的是,既然代码可以用 Makefile 编译,为什么不能用代码运行器编译呢?
只是一个快速更新:我在 CLion 上测试了代码并编译了它,所以我将在 Vs Code 上重新安装代码运行器扩展,看看它是否能解决问题。
解决方案
由于某种原因,MAC 上的 vscode 不会自动链接文件。您可能必须在终端中运行代码。
g++ main.cpp linkedList.cpp -o main
然后就可以执行程序了
./main
注意不要忘记与您正在编译的文件位于同一路径
推荐阅读
- javascript - 浏览器是否有可能缓存图像并且不发出请求?
- java - org.springframework.context.support.GenericApplicationContext 类型无法解析。它是从所需的 .class 文件中间接引用的
- go - 如何在运行已编译的 golang 程序时使用配置文件
- android - 使用 Retrofit2 的响应体为空
- c# - 为什么在单元测试中尝试引用 Moq 对象时出现 NullReferenceException?
- reactjs - React-Native 错误:找不到模块“metro-react-native-babel-preset”
- docker - 如何使用 docker-compose 启动中级 ca?
- android - BLE NOTIFY 特性不通知
- r - 分别注释小平面图的 AUC 值
- xml - 在 .docx 文件的 document.xml 中呈现总页数