본문 바로가기
임베디드.일렉트로닉스

nRF Connect SDK VSCode . C++ 로 코딩하기

by i.got.it 2026. 3. 4.

 

 

 

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++ 표준을 사용할지 지정하는것. 안해도 작동은 하나 명시적으로 설정함이 타당.  

 

 

CMakeLists.txt 설정 의미  
  • 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


 

댓글



비트코인




            암호화폐/외환/나스닥/골드          
       
현물 |선물 인버스 |선물 USDT , bybit MT5               프랍 트레이딩. MT4,MT5