nRF Connect SDK VSCode . C++ 위한 필수 설정
nRF Connect SDK VSCode 컴파일 환경은 파일 확장자 C 로 된 것은 C 컴파일 되고, 파일확장자 cpp 로 된것은 C++ 컴파일 가능하나 필수 아래와 같은 설정을 해줘야 한다.
prj.conf 파일에 C++ 지원추가
- 프로젝트 파일에 있는 prj.conf 파일에 아래 구문 추가.
# prj.conf
############### for C++
CONFIG_CPP=y # C++ 사용위한 필수.
# CONFIG_NEWLIB_LIBC : Zephyr 기본 libc(minimal libc)보다는 Newlib이 C++과의 호환성이 좋음.
CONFIG_NEWLIB_LIBC=y #Newlib는 임베디드 장치용으로 경량화된 표준 C 라이브러리(printf, malloc 등).
CONFIG_EXTERNAL_LIBCPP=n # 외부별도준비한 C++ 라이브러라 사용안함.
CONFIG_GLIBCXX_LIBCPP=y # GNU 표준 libstdc++ 을 사용한다.
################ end for C++
prj.conf 설정 의미.
CONFIG_CPP=y:
- 의미: C++ 위한 필수. C++ 기본 기능
- Class / Inheritance (상속): 클래스 구조화 가능.
- Access Modifiers: public, private, protected.
- Constructors / Destructors: 객체 생성/소멸 로직.
- Templates: 템플릿 문법 자체.
CONFIG_NEWLIB_LIBC=y (보통 C++에선 y 권장):
- 의미: Newlib은 임베디드 장치용으로 경량화된 표준 C 라이브러리(printf, malloc 등).
- C++ 표준 라이브러리는 내부적으로 C 라이브러리의 기능들을 많이 빌려 쓰는데, Zephyr 기본 libc(minimal libc)보다는 Newlib이 C++과의 호환성이 훨씬 좋기 때문에 C++을 쓸 때는 보통 이 옵션을 켠다.
CONFIG_EXTERNAL_LIBCPP=n
- 의미: "외부(External)에서 별도로 준비한 C++ 라이브러리를 쓰지 않겠다."
- 상세: 이 옵션을 y로 켜면, 사용자가 직접 컴파일한 특수한 C++ 라이브러리 파일을 빌드 시스템에 수동으로 연결해줘야 한다. 일반적인 개발 환경에서는 n으로 두는 것이 정석.
CONFIG_GLIBCXX_LIBCPP=y
- 의미: "GNU 방식의 C++ 라이브러리(libstdc++)를 사용한다."
- 상세:
- C++ 표준 라이브러리는 크게 두 종류가 있음 : libstdc++ (GNU 방식)와 libc++ (LLVM/Clang 방식). libstdc++ 을 사용하겠다는 의미. std::vector , std::string 등도 사용가능.
- nRF Connect SDK(NCS)는 내부적으로 GNU 툴체인을 주로 사용하는데, 이 옵션을 n으로 두면 시스템이 알아서 현재 컴파일러와 가장 잘 맞는(주로 Newlib과 짝을 이루는) 기본 라이브러리를 선택한다.
CMakeLists.txt 에 C++ 표준 명시.
- 어떤 C++ 표준을 사용할지 지정하는것. 안해도 작동은 하나 명시적으로 설정함이 타당.

- set(CMAKE_CXX_STANDARD 17):
- "나는 C++17 문법을 사용할 거야"라고 선언하는 것.
- set(CMAKE_CXX_STANDARD_REQUIRED ON):
- 의미: "내가 지정한 C++17을 컴파일러가 지원하지 못한다면, 빌드를 중단(Error)시켜라"라는 의미.
- 만약 이 옵션이 OFF라면, 컴파일러는 C++17이 안 될 때 하위 버전(예: C++11)으로 대충 빌드해버릴 수 있는데, 이를 방지하는 안전장치.
- set(CMAKE_CXX_EXTENSIONS OFF):
- 의미: "GCC 컴파일러 전용 확장 문법(GNU Extensions)을 쓰지 않고, 순수 표준 C++만 쓰겠다"는 선언.
- GNU 확장(Extension)이란?: 표준 C++에는 없지만 GCC 컴파일러가 편의상 제공하는 문법들입니다. (예: 배열 크기를 변수로 지정하는 가변 길이 배열 등)
- 왜 OFF로 하는가?: 코드가 특정 컴파일러에 종속되지 않고 표준을 지키게 하여, 나중에 다른 환경으로 옮기거나 배포할 때 문제가 없도록 하기 위함.
C++ 파일에서 C 로 작성된 헤더파일 include
///// cpp 파일에서,
// Zephyr 헤더는 내부적으로 extern "C" 처리 되어있어 C++ 에서도 그냥 inlcude 하면 됨.
#include <zephyr/kernel.h>
#include <zephyr/bluetooth/bluetooth.h>
// 만약 extern C 가드 없는 C로 작성된 다른 헤더를 가져온다면
extern "C" {
#include "my_old_c_header.h"
}
내가 만든 C 헤더에도 가드 넣기
앞의 코드에서 extern "C" 로 감싸는 이유는 해당 헤더파일에 가드가 없는 경우이며 내가 작성하는 C 헤더라면 아래처럼 처리하면 사용하는 곳에서는 extern "C" 감싸기 없이 그냥 include 하면 된다.
// C++ 컴파일러에게 이건 C 임을 알리는 영역 시작.
#ifdef __cplusplus
extern "C" {
#endif
void init_cy_ble_central(void);
...
int func(uint8_t * pui8);
// C++ 컴파일러에게 이건 C 임을 알리 영역 끝.
#ifdef __cplusplus
}
#endif
- C++ 컴파일러가 읽을 때: __cplusplus라는 매크로가 정의되어 있기에 extern "C" { 구문이 활성화되고, 컴파일러에게 "이 함수들은 이름 꼬기(Name Mangling) 하지 않는다.
- C 컴파일러가 읽을 때: __cplusplus가 정의되어 있지 않기에, #ifdef 안의 extern "C" 구문들은 통째로 무시(Skip)됩니다. C 컴파일러는 평범한 C 코드로 인식하여 에러 없이 통과.
연관
nRF Connect for VS Code .개요 . 포터블 설치
nRF Connect for VS Code 개요 통합 개발 환경: Nordic Semiconductor의 nRF52, nRF53, nRF54 및 nRF91 시리즈를 위한 차세대 VS Code 기반 IDE 확장팩.강력한 확장성: 범용적인 VS Code 환경을 그대로 사용하면서, Nordic 전
igotit.tistory.com
VSCode 에서 nRF5 개발 기초. Zephyr OS 기반
VSCode 에서 nRF5 개발 VSCode 에서 nRF5 (예 : nRF52840, nRF54L15) 칩에서 작동하는 코드를 VSCode 에서 작성하고 칩에 기록하여 실행하고 VSCode 의 터미널에 출력 까지 하는 전체 작업 플로우 핵심 정리. -본
igotit.tistory.com
첫 등록 : 2026.03.04
최종 수정 :
단축 주소 : https://igotit.tistory.com/6471
'임베디드.일렉트로닉스' 카테고리의 다른 글
| VSCode 에서 nRF5 개발 기초. Zephyr OS 기반 (0) | 2026.02.25 |
|---|---|
| 220V 전선 색 (0) | 2024.08.09 |
| 단자대 . 터미널 단자바 . 접지바 (0) | 2024.07.12 |
| 릴레이 . 대전류 . 100A ~ (0) | 2024.07.12 |
| DC-DC 부스트 (스텝업) 모듈 . 입력 10~60V, 출력 12~90V . 주행충전 활용가능 (0) | 2024.07.11 |
댓글