chanyong's notepad

[VSCode] macOS 기반 Visual Studio Code에 C/C++ 분할 컴파일(seperate compilation) 구현 + Undefined symbols for architecture arm64 에러 본문

개발 일지, etc

[VSCode] macOS 기반 Visual Studio Code에 C/C++ 분할 컴파일(seperate compilation) 구현 + Undefined symbols for architecture arm64 에러

chanyongp 2024. 4. 2. 21:14

macOS 기반 VSCode에서의 C/C++ 분할 컴파일 방법에 대해 서술하겠습니다.

 

아시다시피, mac에서는 Visual Studio로 바로 C++ 프로그램을 실행시키기 어려운 만큼, VSCode를 활용하게 됩니다.

VSCode는 에디터에 불과한 만큼 추가적인 확장 프로그램 설치 및 실행과 디버깅을 위한 세팅이 필요합니다.

이는 이전에 올린 글과 아래 글을 참조해주시길 부탁드립니다.

https://yongchanyong.tistory.com/8

 

[VSCode] macOS 기반 Visual Studio Code에 C/C++ 세팅하기

macOS 기반 VSCode에서 C/C++ 환경을 세팅하는 법에 대해 서술하겠습니다. 아시다시피, mac에서는 Visual Studio로 바로 C++ 프로그램을 실행시키기 어려운 만큼, VSCode를 활용하게 됩니다. VSCode는 에디터에

yongchanyong.tistory.com

 

1. 분할 컴파일(seperate compilation) 구현

분할 컴파일의 예시로 연결 리스트 구현이 있습니다. 이는 구조체나 클래스를 정의하거나 함수의 프로토타입을 선언할 헤더파일, 함수의 기능을 구현할 cpp 파일 및 main() 함수를 실행시킬 cpp 파일로 구성됩니다.

 

//LinkedList.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
 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;
}

//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;
}

 

여기에서 main.cpp와 LinkedList.cpp를 합쳐서 실행시키기 위해 settings.json 내부의 아래 코드를 이용할 것입니다.

"cpp": "cd $dir && g++ -std=c++17 *.cpp -o $fileNameWithoutExt && $dir$fileNameWithoutExt"
  },

 

이때 g++ *.cpp는 같은 폴더 내의 모든 cpp 파일을 컴파일하게 만드므로 다른 코드들이 있을 시 에러가 발생합니다.

따라서, 세 파일만 존재하는 폴더를 새로 만든 뒤 LinkedList.cpp에 관해, 또는 main.cpp에 관해 디버깅 후 실행하시면 됩니다.

 

cf) 터미널에서도 코드를 바로 실행시킬 수 있습니다. 이는 VSCode에서의 작동 방식과 유사합니다.

cd "working_folder_directory" && g++ -std=c++17 *.cpp -o filename && "working_folder_directory"filename

 

실행시키고 나면 Unix 실행파일이 생성됨을 확인할 수 있습니다.

2. Undefined symbols for architecture arm64 에러

이때 Undefined symbols for architecture arm64가 발생하며 디버그 및 실행이 안되신다면,

settings.json 내부를 Code Runner 기반으로 다시 작성하고 아래 코드가 들어가 있게 해야 합니다.

"cpp": "cd $dir && g++ -std=c++17 *.cpp -o $fileNameWithoutExt && $dir$fileNameWithoutExt"
  },

 

 

이는 VSCode on MAC이 자동으로 파일들을 link하지 않는 것 때문으로 추정됩니다.

 

+2024/04/30

참고로, 불러오고자 하는 class의 헤더파일은 존재하나, 기능이 구현되어 있는 cpp 파일이 비어있을 경우 에러가 발생할 수 있으니 이 점 유의바랍니다. constructor로 불러서 객체를 사용하고자 한다면 구현되어 있어야 합니다.

References : 

https://yongchanyong.tistory.com/8

 

[VSCode] macOS 기반 Visual Studio Code에 C/C++ 세팅하기

macOS 기반 VSCode에서 C/C++ 환경을 세팅하는 법에 대해 서술하겠습니다. 아시다시피, mac에서는 Visual Studio로 바로 C++ 프로그램을 실행시키기 어려운 만큼, VSCode를 활용하게 됩니다. VSCode는 에디터에

yongchanyong.tistory.com

 

https://su-dong.tistory.com/67

 

Undefined symbols for architecture arm64 vscode mac오류

배열스택을 만들다가 오류가 떴다. 주요 내용은 Undefined symbols for architecture arm64 ld: symbol(s) not found for architecture arm64 clang: error: linker command failed with exit code 1 (use -v to see invocation) 이 세줄 여러 방법

su-dong.tistory.com

https://stackoverflow.com/questions/47665886/vs-code-will-not-build-c-programs-with-multiple-cpp-source-files

 

VS Code will not build c++ programs with multiple .cpp source files

Note that I'm using VS Code on Ubuntu 17.10 and using the GCC Compiler. I'm having trouble building a simple program which makes use of additional .cpp files. I'm probably missing something obvious...

stackoverflow.com

https://stackoverflow.com/questions/66502205/mac-os-vs-code-insiders-code-runner-undefined-symbols-for-architecture-arm6

 

Mac OS - VS Code Insiders - Code Runner: Undefined symbols for architecture arm64

I've been stuck on this issue in the past week. when I compiled the code with the VS Code Insiders - Code Runner Extension or the command: clang++ -std=c++14 main.cpp, it gives me the below error:

stackoverflow.com

 

반응형