제가 WSL을 여러 번 설치하고 CMake로 빌드하면서 겪었던 상황과 문제에 대해서 공유해 보도록 하겠습니다.
WSL, CMake 빌드 시 undefined reference error 해결 방법
1. 필수 standard lib 설치 및 지정 필요
아래와 같은 기본적인 명령어를 알지 못한다면 기본적으로 clang 설치 후 build-essential, libc++-10-dev 와 같은 라이브러리들을 설치하지 않아서 발생한 문제일 경우가 있습니다.
undefined reference to `operator new
undefined reference to `std::cout'
이 경우 clang version에 따라 아래와 같이 설치를 할 필요가 있습니다.
sudo apt install libstdc++-10-dev
2. 만약 설치가 되어 있는데 적용이 되지 않는 다면
1번에서 해당 라이브러리들이 설치가 되어 있는데 적용이 되지 않는다고 한다면 링크가 잘 되지 않는 문제일 수가 있습니다. 따라서 옵션에 직접 추가를 해주는 방법이 있습니다.
CMake에서는 아래와 같이 flag를 추가해 주어서 지정해 줄 수 있습니다.
set(CMAKE_CXX_FLAGS "-stdlib=libc++")
3. 만약 그래도 해결되지 않는 다면
제가 했던 기본적인 실수이기도 한데, CXX 컴파일러에 그냥 clang으로 입력한 경우입니다.
set(CMAKE_C_COMPILER clang)
set(CMAKE_CXX_COMPILER clang)
위와 같이 설정하면 cpp를 빌드할 때 c언어용 라이브러리를 인식하려고 해서인지 제대로 인식이 되지 않는 것 같았습니다.
따라서 아래와 같이 정상적으로 수정하면 해결되는 것을 확인했습니다.
set(CMAKE_C_COMPILER clang)
set(CMAKE_CXX_COMPILER clang++)
결론
가장 기본적인 실수를 한 뒤 이후 여러 가지를 시도하면서 시간낭비를 한 경험입니다. 여러분들을 부디 이런 실수를 하지 않기를 바라면서 글을 남겨봅니다.
반응형
'개발 > C, C++' 카테고리의 다른 글
[C++] STL 컨테이너 unordered set, unordered map 사용법, 차이점 (0) | 2023.11.21 |
---|---|
[C++] class 생성자에서 explicit 키워드의 의미 (0) | 2023.09.05 |
[C++] STL 컨테이너 Set과 Map 활용법과 차이점 (0) | 2023.09.02 |
[C++] STL 컨테이너 Vector 의 용도와 특징, 사용 예제 (0) | 2023.09.01 |
[C++] 생성자에서 virtual 가상 함수 호출하는 경우의 문제 (0) | 2023.08.11 |