c++ Mac OS - VS代码内部人员-代码运行程序:建筑物arm 64的未定义符号

6ie5vjzr  于 2022-12-15  发布在  Mac
关注(0)|答案(4)|浏览(159)

在过去的一周里,我一直被这个问题困扰着。当我用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);
};

linkedList.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上重新安装代码运行器扩展,看看它是否能修复这个问题。

b4lqfgs4

b4lqfgs41#

由于某种原因,MAC上的VSCode不会自动链接文件,您可能必须在终端中运行代码。

g++ main.cpp linkedList.cpp -o main

然后你就可以执行程序了

./main

注意:不要忘记与正在编译的文件位于同一路径

nbysray5

nbysray52#

当使用XCode IDE运行C++代码时,CPP文件不会添加到您试图自动构建的目标中。即使您可以在目标目录下看到它们,但这并不意味着它会添加到该目标的已编译CPP文件中。
您可以将源文件添加到XCode右侧的目标成员中。
另一方面,您能够使用Makefile和其他选项进行构建,因为您指定了需要手动编译的源代码,如下所示

linkedList.o: linkedList.cpp linkedList.h
    clang++ -std=c++14 -c $<

字符串
通常,当您尝试使用XCode构建C++目标时遇到undefined symbols错误,这意味着您缺少一些头文件/函数的实现

m2xkgtsf

m2xkgtsf3#

这是mac用户很常见的错误,尤其是mac m1和m2。我相信这是由底层架构引起的。通过在compile命令中列出所有需要链接的文件来修复这个错误。

g++ file1.cpp file2.cpp ... -o main

我的例子是:

g++ main.c++ agent.c++ model.c++ -o main


好吧,直到我们让visual studio使用CPP for mac。使用这个。

mw3dktmi

mw3dktmi4#

找到了一个“暂时”的答案:在代码运行程序中:执行器Map,在设置中编辑. json,我更改了

"cpp": "cd $dir && clang++ -std=c++14 $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt",

通过在$fileName之后添加linked_list. cpp(实现文件)

"cpp": "cd $dir && clang++ -std=c++14 $fileName linked_list.cpp -o $fileNameWithoutExt && $dir$fileNameWithoutExt",

相关问题