chanyong's notepad
[VSCode] macOS 기반 Visual Studio Code에 C/C++ 분할 컴파일(seperate compilation) 구현 + Undefined symbols for architecture arm64 에러 본문
[VSCode] macOS 기반 Visual Studio Code에 C/C++ 분할 컴파일(seperate compilation) 구현 + Undefined symbols for architecture arm64 에러
chanyongp 2024. 4. 2. 21:14macOS 기반 VSCode에서의 C/C++ 분할 컴파일 방법에 대해 서술하겠습니다.
아시다시피, mac에서는 Visual Studio로 바로 C++ 프로그램을 실행시키기 어려운 만큼, VSCode를 활용하게 됩니다.
VSCode는 에디터에 불과한 만큼 추가적인 확장 프로그램 설치 및 실행과 디버깅을 위한 세팅이 필요합니다.
이는 이전에 올린 글과 아래 글을 참조해주시길 부탁드립니다.
https://yongchanyong.tistory.com/8
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
https://su-dong.tistory.com/67
'개발 일지, etc' 카테고리의 다른 글
kt 공유기 수동 IP 설정, 포트포워딩 및 DMZ 설정 (0) | 2024.10.25 |
---|---|
[VSCode] macOS 기반 Visual Studio Code에 C/C++ 세팅하기(+ 20241025 수정) (0) | 2024.02.19 |
신체 불균형 분석 AI 프로젝트(2023) (0) | 2024.02.03 |