<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>cpp | bitneer.dev</title>
	<atom:link href="https://www.bitneer.dev/blog/tag/cpp/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.bitneer.dev</link>
	<description>AI 시대에 취미로 하는 코딩</description>
	<lastBuildDate>Mon, 29 Dec 2025 23:50:33 +0000</lastBuildDate>
	<language>ko-KR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8.3</generator>

<image>
	<url>https://www.bitneer.dev/wp/wp-content/uploads/2023/11/cropped-bitneer_Logo_for_Google_200-32x32.png</url>
	<title>cpp | bitneer.dev</title>
	<link>https://www.bitneer.dev</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>VS Code에 WSL의 C/C++ 개발 환경 설정하기</title>
		<link>https://www.bitneer.dev/blog/vs-code%ec%97%90-wsl%ec%9d%98-c-cpp-%ea%b0%9c%eb%b0%9c-%ed%99%98%ea%b2%bd-%ec%84%a4%ec%a0%95%ed%95%98%ea%b8%b0/</link>
		
		<dc:creator><![CDATA[Choi Kyung-sik]]></dc:creator>
		<pubDate>Mon, 22 Dec 2025 12:23:04 +0000</pubDate>
				<category><![CDATA[C/CPP]]></category>
		<category><![CDATA[cpp]]></category>
		<category><![CDATA[vscode]]></category>
		<category><![CDATA[wsl]]></category>
		<guid isPermaLink="false">https://www.bitneer.dev/?p=9948</guid>

					<description><![CDATA[<div data-nosnippet>C/C++ 개발을 위한 확장 설치하기 C/C++ Extension Pack 확장을 설치한다. 이 확장은 데비안(Debian)의 메타 패키지와 유사하게 여러 확장을 모아 놓은 것으로, 설치 시 다음과 같은 C++ 개발 필수 확장들이 함께 설치된다. C/C++ C/C++ Themes CMake Tools 코드 분석 도구로는 Microsoft C/C++ 확장보다 clangd 확장이 더 빠르고 지능적이라는 평가를 받는다. clangd 확장을 설치할 때, 아래 그림과 같이 제작사인 LLVM을 신뢰할 것인지 ...</div>
<p>The post <a rel="nofollow" href="https://www.bitneer.dev/blog/vs-code%ec%97%90-wsl%ec%9d%98-c-cpp-%ea%b0%9c%eb%b0%9c-%ed%99%98%ea%b2%bd-%ec%84%a4%ec%a0%95%ed%95%98%ea%b8%b0/">VS Code에 WSL의 C/C++ 개발 환경 설정하기</a> appeared first on <a rel="nofollow" href="https://www.bitneer.dev">bitneer.dev</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h5>C/C++ 개발을 위한 확장 설치하기</h5>
<p>
  <strong>C/C++ Extension Pack</strong> 확장을 설치한다. 이 확장은
  데비안(Debian)의 메타 패키지와 유사하게 여러 확장을 모아 놓은 것으로, 설치 시
  다음과 같은 C++ 개발 필수 확장들이 함께 설치된다.
</p>
<ul>
  <li>C/C++</li>
  <li>C/C++ Themes</li>
  <li>CMake Tools</li>
</ul>
<p>
  코드 분석 도구로는 Microsoft C/C++ 확장보다 <strong>clangd</strong> 확장이 더
  빠르고 지능적이라는 평가를 받는다.
</p>
<p>
  clangd 확장을 설치할 때, 아래 그림과 같이 제작사인 LLVM을 신뢰할 것인지 묻는
  창이 나타나면 <strong>Trust Publisher &amp; Install</strong> 버튼을 클릭하여
  설치를 진행한다.
</p>
<img decoding="async"
  src="https://cdn.jsdelivr.net/gh/bitneer/wp-media-001/2025-12-21/001.png"
  alt="clangd 확장 설치시 경고 창"
/>
<p>clangd 확장 설치를 완료하면 우측 하단에 두 개의 알림 창이 나타난다.</p>
<img decoding="async"
  src="https://cdn.jsdelivr.net/gh/bitneer/wp-media-001/2025-12-21/002.png"
  alt="clangd 확장 설치시 알림 창"
/>
<ol>
  <li>
    clangd language server가 없다는 알림 창에서는
    <strong>Install</strong> 버튼을 클릭하여 설치한다.
  </li>
  <li>
    Microsoft C/C++ 확장과 clangd 확장이 충돌한다는 알림 창에서는
    <strong>Disable IntelliSense</strong> 버튼을 클릭한 후, 이어지는
    <strong>Reload</strong> 버튼을 클릭하여 VS Code 설정을 다시 불러온다.<br />
  </li>
</ol>
<p>
  이렇게 하면 Microsoft C/C++ 확장의 인텔리센스(코드 분석/자동 완성) 기능만
  비활성화되고, 디버깅 기능(GDB/LLDB 연동)은 그대로 유지되어 두 확장의 장점을
  모두 활용할 수 있다.
</p>
<h5>프로젝트 폴더에 CMakeLists.txt 파일 생성하기</h5>
<p>
  <kbd>tasks.json</kbd>이나 <kbd>launch.json</kbd> 파일을 수동으로 만들기보다
  <strong>CMake</strong>를 사용하여 빌드 시스템을 정의하는 것이 효율적이다. 최근
  대부분의 C++ 프로젝트는 CMake를 표준으로 사용한다. CMake는 빌드 파일을 직접
  생성하는 것이 아니라 <kbd>make</kbd>나 <kbd>Ninja</kbd>용 빌드 파일을 생성해
  주는 도구이다. 최신 개발 환경에서는 <kbd>cmake -G Ninja</kbd> 명령을 통해
  속도가 빠른 <strong>Ninja</strong>를 사용하는 것이 추세다.
</p>
<p>
  VS Code의 <strong>CMake Tools</strong> 확장을 활용하면 빌드, 테스트, 디버깅
  설정을 자동화할 수 있다. 이 확장은 CMake 프로젝트를 인식하면 하단 상태
  표시줄에 <em>빌드, 디버그, 실행</em> 버튼을 제공한다.
</p>
<p>
  CMake 프로젝트임을 인식시키기 위해 프로젝트 루트 폴더에
  <strong><kbd>CMakeLists.txt</kbd></strong> 파일을 생성한다. 이전 글(<a
    rel="noopener noreferrer"
    target="_blank"
    href="https://www.bitneer.dev/blog/wsl에-c-cpp-개발을-위한-패키지-설치하기/"
    >WSL에 C/C++ 개발을 위한 패키지 설치하기</a
  >)에서 생성한 <kbd>wsl_cpp</kbd> 디렉터리를 그대로 사용한다.
</p>
<p>
  파일을 생성하면 곧바로 <strong>Kit</strong>을 선택하라는 창이 나타난다. 동시에
  하단 상태 표시줄에는 빌드 설정, 디버그, 실행 아이콘이 생성된다. 만약 Kit 선택
  창을 닫았다면 상태 표시줄의 <strong>Build</strong> 설정 아이콘을 클릭하여 다시
  열 수 있다.
</p>
<img decoding="async"
  src="https://cdn.jsdelivr.net/gh/bitneer/wp-media-001/2025-12-21/003.png"
  alt="kit 선택 화면 첫번째로 Clang 안나옴"
/>
<p><br /></p>
<img decoding="async"
  src="https://cdn.jsdelivr.net/gh/bitneer/wp-media-001/2025-12-21/004.png"
  alt="상태 표시줄의 CMake Tools 아이콘"
/>
<p>
  Kit 선택 창에서 사용할 컴파일러를 선택한다. 보통 Clang이나 GCC를 선택한다. 위
  그림에 <kbd>mingw32</kbd> 항목이 보이는 이유는 리눅스 환경에서 윈도우용 실행
  파일(.exe)을 만드는 크로스 컴파일 테스트를 위해 <kbd>mingw-w64</kbd> 패키지를
  설치했기 때문이다. 일반적인 리눅스 환경의 GCC를 사용하려면
  <kbd>/usr/bin/gcc</kbd>, <kbd>/usr/bin/g++</kbd> 경로가 표시된 항목을
  선택한다. 만약 Clang이 목록에 없다면 맨 위의 <strong>Scan for kits</strong>를
  실행하여 컴파일러를 새로 검색한다.
</p>
<img decoding="async"
  src="https://cdn.jsdelivr.net/gh/bitneer/wp-media-001/2025-12-21/005.png"
  alt="kit 선택 화면 두번째로 Clang 나옴"
/>
<p>
  검색 후 위 그림과 같이 Clang 컴파일러 항목이 나타나면, WSL Linux 시스템 경로인
  <kbd>/usr/bin/clang</kbd>, <kbd>/usr/bin/clang++</kbd>이 포함된 항목을
  선택한다.
</p>
<p>
  컴파일러 선택을 마치면 프로젝트 폴더에 <kbd>build</kbd> 디렉터리가 자동으로
  생성된다. 이전에 테스트로 생성했던 <kbd>a.out</kbd>이나 <kbd>hello</kbd> 실행
  파일은 삭제해도 무방하다. 앞으로 빌드 결과물은 모두 <kbd>build</kbd> 디렉터리
  안에 생성되기 때문이다. 왼쪽 액티비티 바(Activity Bar)에
  <strong>CMake</strong> 아이콘이 추가된 것도 확인할 수 있다.
</p>
<img decoding="async"
  src="https://cdn.jsdelivr.net/gh/bitneer/wp-media-001/2025-12-21/006.png"
  alt="CMake Tools의 build 디렉터리 생성"
/>
<h5>CMakeLists.txt 파일에 설정 내용 추가하기</h5>
<p>
  <kbd>CMakeLists.txt</kbd> 파일에 아무 내용도 입력하지 않으면, 아래 그림과 같이
  <strong>OUTPUT</strong> 패널의 <strong>CMake/Build</strong> 메시지에 경고가
  표시된다.
</p>
<img decoding="async"
  src="https://cdn.jsdelivr.net/gh/bitneer/wp-media-001/2025-12-21/007.png"
  alt="CMakeLists.txt에 내용이 없어 OUTPUT에 경고 메시지 출력"
/>
<p><kbd>CMakeLists.txt</kbd> 파일에 다음 내용을 추가한다.</p>
<pre class="language-none line-numbers" data-label="CMakeLists.txt">
<code>cmake_minimum_required(VERSION 3.10)
project(WSLCPP LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
add_executable(hello hello.cpp)</code>
</pre>
<ul>
  <li>라인 1: 최소 CMake 요구 버전 설정.</li>
  <li>라인 2: 프로젝트 이름 및 사용 언어 설정.</li>
  <li>라인 3, 4: C++17 표준 사용을 강제하는 설정.</li>
  <li>
    라인 5: clangd를 위한 컴파일 데이터베이스(<kbd>compile_commands.json</kbd>)
    생성 설정.
  </li>
  <li>
    라인 6: <kbd>hello.cpp</kbd> 소스 파일을 사용하여 <kbd>hello</kbd>라는
    이름의 실행 파일을 생성하는 설정.
  </li>
</ul>
<p>
  파일을 저장하면 <strong>OUTPUT</strong> 패널에서 설정을 자동으로 반영한다.
  만약 자동 반영이 되지 않는다면 <strong>Ctrl + Shift + P</strong>를 누른 후
  <strong>CMake: Configure</strong>를 실행한다.
</p>
<pre class="language-none" data-line="2">
<code>[main] Configuring project: wsl_cpp 
[proc] Executing command: /usr/bin/cmake -DCMAKE_BUILD_TYPE:STRING=Debug -DCMAKE_EXPORT_COMPILE_COMMANDS:BOOL=TRUE -DCMAKE_C_COMPILER:FILEPATH=/usr/bin/clang -DCMAKE_CXX_COMPILER:FILEPATH=/usr/bin/clang++ --no-warn-unused-cli -S /home/bitneer/study/CPP/wsl_cpp -B /home/bitneer/study/CPP/wsl_cpp/build -G Ninja
[cmake] Not searching for unused variables given on the command line.
[cmake] -- Configuring done
[cmake] -- Generating done
[cmake] -- Build files have been written to: /home/bitneer/study/CPP/wsl_cpp/build</code>
</pre>
<p>
  로그의 두 번째 라인에서 설정한 컴파일러와 빌드 시스템을 확인한다. 위
  예시에서는 <strong>Clang</strong>과 <strong>Ninja</strong>를 사용하고 있다.
  CMake Tools 확장은 시스템에 Ninja가 설치되어 있으면 기존의 <kbd>make</kbd>보다
  속도가 빠른 Ninja를 우선적으로 선택한다.
</p>
<p>빌드 도구를 <kbd>make</kbd>로 변경하고 싶다면 다음 과정을 따른다.</p>
<ol>
  <li>
    <strong>Ctrl + ,</strong> 키로 설정을 연 후
    <strong>Cmake: Generator</strong> 항목에 <kbd>Unix Makefiles</kbd>를
    입력한다.
  </li>
  <li>프로젝트 루트의 <kbd>build</kbd> 폴더를 삭제한다.</li>
  <li>
    <strong>Ctrl + Shift + P</strong>를 누른 후
    <strong>CMake: Configure</strong>를 실행하여 설정을 재구성한다.
  </li>
</ol>
<h5>CMake Tools 확장의 빌드와 실행</h5>
<p>
  상태 표시줄의 <strong>빌드(Build)</strong> 아이콘을 클릭하여 컴파일한 후,
  <strong>실행(Run)</strong> 아이콘을 클릭한다. 아래 그림과 같이 터미널 탭에서
  실행 결과를 확인할 수 있다.
</p>
<img decoding="async"
  src="https://cdn.jsdelivr.net/gh/bitneer/wp-media-001/2025-12-21/008.png"
  alt="CMake Tools를 사용한 빌드와 실행"
/>
<p>CMake Tools의 주요 단축키는 다음과 같다.</p>
<ul>
  <li>빌드: <strong>F7</strong></li>
  <li>디버그 없이 실행: <strong>Ctrl + Shift + F5</strong></li>
</ul>
<h5>여러 개의 main 함수 관리하기</h5>
<p>
  학습 중에는 여러 소스 파일에 각각 <kbd>main</kbd> 함수를 두고 관리하고 싶을
  때가 있다. <kbd>add_executable</kbd>을 매번 수동으로 추가하는 것은
  번거로우므로, 다음과 같은 자동화 방법을 추천한다.
</p>
<p>
  1. <kbd>CMakeLists.txt</kbd>에서 기존
  <kbd>add_executable(hello hello.cpp)</kbd> 줄을 삭제하고 아래 내용을 추가한다.
  하위 폴더를 재귀적으로 검색하여 <kbd>main_</kbd>으로 시작하는 모든 파일을
  각각의 실행 파일로 등록한다.
</p>
<pre class="language-none" data-label="CMakeLists.txt">
<code># 폴더 아래의 main_*.cpp 파일을 모두 재귀적으로 찾기
file(GLOB_RECURSE MAIN_FILES "main_*.cpp")
foreach(main_file ${MAIN_FILES})
    get_filename_component(target_name ${main_file} NAME_WE)
    add_executable(${target_name} ${main_file})
endforeach()</code>
</pre>
<p>
  2. 기존 <kbd>hello.cpp</kbd> 파일명을 <kbd>main_hello.cpp</kbd>로 변경한다.
</p>
<p>
  3. <strong>Ctrl + Shift + P</strong> 키를 누른 후
  <strong>CMake: Configure</strong>를 실행한다.
</p>
<p>
  4. 테스트를 위해 다음 내용을 가진 <kbd>main_goobye.cpp</kbd> 파일을 생성한다.
</p>

<pre class="language-cpp" data-label="main_goobye.cpp">
<code>#include &ltiostream&gt;

int main() {
    std::cout << "Goodbye, WSL!" << std::endl;
    return 0;
}</code>
</pre>
<p>
  5. 설정이 확실히 반영되도록 <strong>Ctrl + Shift + P</strong> 키를 누른 후
  <strong>CMake: Delete Cache and Reconfigure</strong>를 실행한다.
</p>
<p>
  6. 액티비티 바의 <strong>CMake</strong> 아이콘 클릭 후,
  <strong>Launch</strong> 항목의 편집 아이콘을 클릭하여 실행할 타겟을 선택한다.
</p>
<img decoding="async"
  src="https://cdn.jsdelivr.net/gh/bitneer/wp-media-001/2025-12-21/009.png"
  alt="여러개의 main 함수가 있을 때 타겟 선택"
/>
<p>
  7. 타겟을 선택한 후 상태 표시줄의 실행 아이콘을 누르면 해당 파일이 실행된다.
</p>
<p>과정이 복잡해 보인다면 단축키를 설정하여 단순화할 수 있다.</p>
<p>
  예: <strong>CMake: Delete Cache and Reconfigure</strong> 단축키
  <strong>Ctrl + Shift + F7</strong> &rarr;
  <strong>CMake: Set Launch/Debug Target</strong> 단축키
  <strong>Ctrl + Shift + F6</strong> &rarr;
  <strong>CMake: Run Without Debugging</strong> 단축키
  <strong>Ctrl + Shift + F5</strong>
</p>
<h5>코드 포맷 설정</h5>
<p>
  소스 코드에서 마우스 오른쪽 버튼을 클릭하여 <strong>Format Document</strong>를
  선택하거나 포맷 단축키를 누른다.
</p>
<img decoding="async"
  src="https://cdn.jsdelivr.net/gh/bitneer/wp-media-001/2025-12-21/010.png"
  alt="포멧터 선택시 포맷할 수 없음을 나타내는 창"
/>
<p>
  Microsoft C/C++ 확장의 인텔리센스를 비활성화했기 때문에 위와 같은 안내 창이
  뜬다. <strong>Configure</strong> 버튼을 클릭한 후 포맷터로
  <strong>clangd</strong>를 선택한다.
</p>
<img decoding="async"
  src="https://cdn.jsdelivr.net/gh/bitneer/wp-media-001/2025-12-21/011.png"
  alt="clangd를 포멧터로 선택하는 화면"
/>
<h5>.clang-format 포맷 설정</h5>
<p>
  C++ 코드 스타일은 <kbd>.clang-format</kbd> 파일로 관리하는 것이 표준이다.
  프로젝트 루트에 파일을 생성하고 다음 내용을 입력한다. 구글 스타일(Google
  Style) 기반의 예시 설정이다.
</p>

<pre class="language-yaml" data-label=".clang-format">
<code>BasedOnStyle: Google
IndentWidth: 2	# 들여쓰기 설정
ColumnLimit: 100  # 한 줄의 최대 길이 (보통 80~100자)
InsertTrailingNewline: true  # 파일 끝에 빈 줄 추가 활성화 - Clang 16 버전에서 처음 도입. 이전 버전 적용 안됨
AllowShortFunctionsOnASingleLine: Empty  # 중괄호 및 공백 설정
BreakBeforeBraces: Attach  # 구글 스타일: 함수 옆에 중괄호 붙이기</code>
</pre>
<h5>.clangd 설정</h5>
<p>
  소스 파일을 열면 하단에 <strong>clangd</strong> 확장 아이콘이 표시된다. CMake
  프로젝트의 표준인 <kbd>build</kbd> 디렉터리를 사용하면 clangd가
  <kbd>compile_commands.json</kbd>을 자동으로 찾아 코드 분석, 정의 이동,
  리팩토링 등을 수행한다.
</p>
<img decoding="async"
  src="https://cdn.jsdelivr.net/gh/bitneer/wp-media-001/2025-12-21/012.png"
  alt="상태 표시줄의 clangd 아이콘"
/>
<p>
  <kbd>.clangd</kbd> 파일은 clangd의 동작을 세밀하게 제어한다. 프로젝트 루트에
  파일을 생성하고 다음 설정을 추가해 보자.
</p>
<pre class="language-yaml" data-label=".clangd">
<code>CompileFlags:
  CompilationDatabase: build  # CMake 빌드 데이터베이스 위치 지정. build가 기본값이나 나중의 변경을 위해 명시.

Index:
  Background: Build  # 백그라운드 인덱싱 활성화. 코드 정의 이동 및 심볼 검색 속도 향상.

InlayHints:   # 코드 내 인라인 힌트 설정
  Enabled: Yes
  ParameterNames: Yes
  DeducedTypes: Yes
  Designators: Yes

Diagnostics: # 코드 진단 및 교정
  ClangTidy:
    Add: [modernize-*, readability-*, bugprone-*] 
    Remove: [modernize-use-trailing-return-type]
    CheckOptions:
      readability-identifier-naming.VariableCase: camelCase</code>
</pre>
<p>
  설정을 변경했다면 <strong>Ctrl + Shift + P</strong> 키를 누른 후
  <strong>clangd: Restart language server</strong>를 실행하여 적용한다.
</p>
<h5>관련 글</h5>
<ul>
  <li>
    <a
      rel="noopener noreferrer"
      target="_blank"
      href="https://www.bitneer.dev/blog/wsl에-c-cpp-개발을-위한-패키지-설치하기/"
      >WSL에 C/C++ 개발을 위한 패키지 설치하기</a
    >
  </li>
</ul>
<p>The post <a rel="nofollow" href="https://www.bitneer.dev/blog/vs-code%ec%97%90-wsl%ec%9d%98-c-cpp-%ea%b0%9c%eb%b0%9c-%ed%99%98%ea%b2%bd-%ec%84%a4%ec%a0%95%ed%95%98%ea%b8%b0/">VS Code에 WSL의 C/C++ 개발 환경 설정하기</a> appeared first on <a rel="nofollow" href="https://www.bitneer.dev">bitneer.dev</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>WSL에 C/C++ 개발을 위한 패키지 설치하기</title>
		<link>https://www.bitneer.dev/blog/wsl%ec%97%90-c-cpp-%ea%b0%9c%eb%b0%9c%ec%9d%84-%ec%9c%84%ed%95%9c-%ed%8c%a8%ed%82%a4%ec%a7%80-%ec%84%a4%ec%b9%98%ed%95%98%ea%b8%b0/</link>
		
		<dc:creator><![CDATA[Choi Kyung-sik]]></dc:creator>
		<pubDate>Mon, 22 Dec 2025 12:22:45 +0000</pubDate>
				<category><![CDATA[C/CPP]]></category>
		<category><![CDATA[cpp]]></category>
		<category><![CDATA[wsl]]></category>
		<guid isPermaLink="false">https://www.bitneer.dev/?p=9941</guid>

					<description><![CDATA[<div data-nosnippet>gcc/g++ 컴파일러 사용을 위한 개발 환경 데비안(Debian) 계열 리눅스에서 C/C++ 개발을 하고자 할 때 build-essential 패키지를 설치한다. 이 패키지는 여러 필수 패키지를 의존성으로 묶어 한 번에 설치할 수 있게 돕는 메타 패키지이다. 메타 패키지는 실제 실행 파일은 포함하지 않고 의존성 정보만 가지고 있어 &#34;빈 패키지(empty package)&#34;라고도 부른다. 다음 명령어로 의존성을 확인할 수 있다. apt는 apt-get과 apt-cache 기능을 통합한 것이므로 apt ...</div>
<p>The post <a rel="nofollow" href="https://www.bitneer.dev/blog/wsl%ec%97%90-c-cpp-%ea%b0%9c%eb%b0%9c%ec%9d%84-%ec%9c%84%ed%95%9c-%ed%8c%a8%ed%82%a4%ec%a7%80-%ec%84%a4%ec%b9%98%ed%95%98%ea%b8%b0/">WSL에 C/C++ 개발을 위한 패키지 설치하기</a> appeared first on <a rel="nofollow" href="https://www.bitneer.dev">bitneer.dev</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h5>gcc/g++ 컴파일러 사용을 위한 개발 환경</h5>
<p>
  데비안(Debian) 계열 리눅스에서 C/C++ 개발을 하고자 할 때
  <kbd>build-essential</kbd> 패키지를 설치한다. 이 패키지는 여러 필수 패키지를
  의존성으로 묶어 한 번에 설치할 수 있게 돕는 메타 패키지이다. 메타 패키지는
  실제 실행 파일은 포함하지 않고 의존성 정보만 가지고 있어 &quot;빈 패키지(empty
  package)&quot;라고도 부른다. 다음 명령어로 의존성을 확인할 수 있다.
  <kbd>apt</kbd>는 <kbd>apt-get</kbd>과 <kbd>apt-cache</kbd> 기능을 통합한
  것이므로 <kbd>apt depends</kbd> 대신 <kbd>apt-cache depends</kbd>를 사용할
  수도 있다.
</p>
<pre class="language-none">
<code>$ apt depends build-essential
build-essential
 |의존: libc6-dev
  의존: &lt;libc-dev&gt;
    libc6-dev
  의존: gcc (&gt;= 4:10.2)
  의존: g++ (&gt;= 4:10.2)
  의존: make
    make-guile
  의존: dpkg-dev (&gt;= 1.17.11)</code>
</pre>
<p>
  <strong><kbd>gcc</kbd></strong
  >와 <strong><kbd>g++</kbd></strong
  >은 각각 C와 C++ 컴파일러이며, <strong><kbd>make</kbd></strong
  >는 빌드 자동화 도구이다. <kbd>build-essential</kbd> 패키지는 이러한 핵심
  도구들에 의존하므로, 이를 설치하면 관련 도구들이 일괄 설치된다. 물론 필요에
  따라 이들을 개별적으로 설치하는 것도 가능하다.
</p>
<p>
  추가로 <strong><kbd>gdb</kbd></strong
  >와 <strong><kbd>cmake</kbd></strong> 패키지를 함께 설치하는 것이 좋다.
  <kbd>gdb</kbd>는 디버거이며, <kbd>cmake</kbd>는 현대적인 C/C++ 프로젝트 관리를
  위한 표준 빌드 시스템 생성기이다. 특히 VS Code의 &#8216;CMake Tools&#8217; 확장을 제대로
  활용하기 위해서는 <kbd>cmake</kbd> 설치가 필수적이다.
</p>
<p>
  패키지 설치 전에는 다음과 같이 패키지 목록 업데이트와 시스템 업그레이드를 먼저
  수행한다.
</p>
<pre class="language-none">
<code>$ sudo apt update && sudo apt upgrade</code>
</pre>
<p>
  참고로 논리 AND(<kbd>&amp;&amp;</kbd>)는 앞선 명령이 성공했을 때만 뒷 명령을
  실행하라는 의미이다. 이와 반대로 논리 OR(<kbd>||</kbd>)은 앞선 명령이 실패했을
  때만 뒷 명령을 실행한다. (예: 명령이 실패할 경우 에러 메시지를 출력할 때 주로
  사용한다.)
</p>
<p>C/C++ 개발에 필요한 패키지들을 다음과 같이 설치한다.</p>
<pre class="language-none">
<code>$ sudo apt install build-essential gdb cmake</code>
</pre>
<p>
  이미 설치된 패키지가 있다면 자동으로 제외하고 중복 설치하지 않는다. 다만, 새
  패키지를 설치하는 과정에서 의존성 해결을 위해 기존 패키지가 업그레이드될 수는
  있다.
</p>
<p>
  <kbd>dpkg -l</kbd> 명령은 시스템에 설치된 모든 패키지 목록을 보여준다. 다음과
  같이 파이프(<kbd>|</kbd>)와 <kbd>grep</kbd>을 연결하여 특정 패키지의 설치
  여부를 확인할 수 있다.
</p>
<pre class="language-none">
<code>$ dpkg -l | grep cmake
ii  cmake                              3.25.1-1                       amd64        cross-platform, open-source make system
ii  cmake-data                         3.25.1-1                       all          CMake data files (modules, templates and documentation)</code>
</pre>
<p>
  또는 다음과 같이 버전 정보를 출력하여 설치 여부를 확인하거나, 실행 파일의
  위치를 알려주는 <kbd>which</kbd> 명령어를 사용할 수 있다.
</p>
<pre class="language-none">
<code>$ gcc --version
$ g++ --version
$ make --version
$ cmake --version
$ which g++</code>
</pre>
<h5>Clang 컴파일러 사용을 위한 개발 환경</h5>
<p>
  GCC 대신 애플(Apple)이 주도하여 개발한 Clang 컴파일러를 사용할 수도 있다.
  Clang은 에러 메시지가 매우 명확하고 친절하며, Apache 2.0 라이선스를 채택해
  기업 친화적이고 유연하다. 반면 GCC는 대부분의 리눅스 배포판 커널과 기본
  시스템을 빌드하는 검증된 컴파일러이며, 런타임 성능 최적화가 매우 정교하다.
  또한 GCC는 GPL 라이선스를 따르므로 소스 코드 공개 의무와 전염성이 강하다는
  특징이 있다.
</p>
<p>
  일반적으로 학습용이나 개발 단계에서는 친절한 에러 메시지 덕분에 오타나 문법
  실수를 빠르게 교정할 수 있는 Clang을 사용하고, 실제 배포용 빌드에는 GCC를
  사용하는 하이브리드 전략을 취하기도 한다. C++ 표준은 계속 발전하고 있지만,
  GCC와 Clang 모두 최신 표준을 빠르게 도입하고 있으므로 어떤 것을 선택해도 최신
  문법 활용에는 지장이 없다.
</p>
<p>
  Clang으로 개발 환경을 구축할 때는 가급적 Clang 기반의 전체 도구
  세트(Toolchain)를 갖추는 것이 좋다. 주요 패키지 목록은 다음과 같다.
</p>
<ul>
  <li><strong>clang</strong>: 컴파일러</li>
  <li><strong>lldb</strong>: 디버거</li>
  <li><strong>valgrind</strong>: 메모리 분석 도구</li>
  <li><strong>clang-format</strong>: 코드 스타일 정리 도구</li>
  <li><strong>clang-tidy</strong>: 정적 분석 도구</li>
</ul>
<p>위 패키지들을 다음 명령으로 한 번에 설치한다.</p>
<pre class="language-none">
<code>$ sudo apt install clang lldb valgrind clang-format clang-tidy</code>
</pre>
<h5>Ninja 빌드 시스템 설치</h5>
<p>
  현대적인 C++ 개발 환경에서 Ninja는 이미 <kbd>make</kbd>를 대체하는 표준으로
  자리 잡았다. 대규모 오픈 소스 프로젝트를 분석할 때 &#8216;컴파일
  데이터베이스(<kbd>compile_commands.json</kbd>)&#8217; 파일을 생성해야 VS Code의
  &#8216;C/C++&#8217; 확장이나 &#8216;clangd&#8217; 확장에서 코드 바로가기, 자동 완성 기능을 정확히
  제공할 수 있다.
</p>
<p>
  이 파일을 생성하기 위해 기존의 <kbd>make</kbd>와 <kbd>bear</kbd>를 조합하는
  방법과 <kbd>Ninja</kbd> 빌드 시스템을 사용하는 두 가지 방법이 있다. 리눅스
  커널이나 고전적인 C 라이브러리 등 오래된 프로젝트를 분석한다면
  <kbd>make</kbd> + <kbd>bear</kbd> 조합이 적합하며, 현대적인 프로젝트라면
  <kbd>Ninja</kbd>를 사용하는 것이 효율적이다.
</p>
<p>
  다음과 같이 <kbd>bear</kbd>와 <kbd>ninja-build</kbd> 패키지를 설치하고, 가급적
  <kbd>make</kbd> 대신 <kbd>Ninja</kbd>를 주력으로 사용하도록 한다.
</p>
<pre class="language-none">
<code>$ sudo apt install bear ninja-build</code>
</pre>
<h5>예제 작성과 컴파일 테스트</h5>
<p>
  VS Code의 C/C++ 관련 확장을 설치하기 전, 간단한 예제를 작성하여
  명령줄(CLI)에서 설치한 컴파일러가 잘 작동하는지 확인해 본다. 윈도우 터미널을
  통해 WSL에 접속한 후 프로젝트 디렉터리를 생성하고 이동한다.
</p>
<pre class="language-none">
<code>$ mkdir wsl_cpp
$ cd wsl_cpp</code>
</pre>
<p>
  <kbd>vi</kbd>나 VS Code를 사용하여 다음 내용을 입력하고
  <kbd>hello.cpp</kbd>라는 이름으로 저장한다. 해당 디렉터리에서
  <kbd>code .</kbd> 명령을 실행하면 현재 폴더를 작업 영역으로 하여 VS Code가
  열린다.
</p>
<pre class="language-cpp" data-label="hello.cpp">
<code>#include &ltiostream&gt;

int main() {
    std::cout << "Hello, WSL!" << std::endl;
    return 0;
}</code>
</pre>
터미널에서 <strong><kbd>g++</kbd></strong
>을 사용하여 컴파일하고 실행해 본다.
<pre class="language-none">
<code>$ g++ hello.cpp
$ ./a.out
Hello, WSL!</code>
</pre>
<p>
  별도의 옵션 없이 컴파일하면 실행 파일 이름은 기본적으로 <kbd>a.out</kbd>으로
  생성된다. 실행 시 <kbd>./</kbd>와 같이 현재 디렉터리를 명시해야 하는데, 이는
  유닉스 계열 시스템이 보안상의 이유로 현재 디렉터리를 실행
  경로(<kbd>PATH</kbd>)에 포함하지 않기 때문이다. 반면 윈도우의 명령
  프롬프트(CMD)는 현재 디렉터리를 실행 경로에 포함한다는 차이가 있다. 현재 실행
  경로는 <kbd>echo $PATH</kbd> 명령어로 확인할 수 있다.
</p>
<p>
  다음과 같이 <kbd>-o</kbd> 옵션을 사용하면 생성될 실행 파일의 이름을 직접
  지정할 수 있다.
</p>
<pre class="language-none">
<code>$ g++ -o hello hello.cpp
$ ./hello
Hello, WSL!</code>
</pre>
<p>
  Clang의 경우 C 컴파일러는 <strong><kbd>clang</kbd></strong
  >, C++ 컴파일러는 <strong><kbd>clang++</kbd></strong> 명령어를 사용한다.
  다음과 같이 여러 옵션을 붙여 컴파일해 본다. (이 옵션들은 <kbd>g++</kbd>에서도
  동일하게 사용할 수 있다.)
</p>
<pre class="language-none">
<code>$ clang++ -Wall -std=c++17 -g -o hello hello.cpp
$ ./hello
Hello, WSL!</code>
</pre>
<ul>
  <li><strong>-Wall</strong>: 모든 경고(Warning) 메시지를 출력한다.</li>
  <li><strong>-std=c++17</strong>: 사용할 C++ 표준 버전을 명시한다.</li>
  <li>
    <strong>-g</strong>: 디버깅 정보를 포함하여 <kbd>gdb</kbd>나
    <kbd>lldb</kbd>에서 사용할 수 있게 한다. (최종 제품 배포 시에는 이 옵션을
    제외한다.)
  </li>
</ul>
<p>
  이외에도 최적화 단계를 지정하는 옵션 등이 있으며, 이러한 설정값들은 주로
  <kbd>Makefile</kbd>이나 <kbd>Ninja</kbd> 빌드 파일에서 정의하여 사용한다.
</p>
<p>
  과거에는 유닉스나 리눅스 환경에서 <kbd>vi</kbd>, <kbd>Emacs</kbd> 같은
  에디터만으로 작업해야 했고, 파이썬이 보급되기 전에는 복잡한 빌드 과정을
  관리하기 위해 쉘 스크립트를 직접 작성해야 했다.
</p>
<p>
  이제는 VS Code 덕분에 훨씬 편리한 환경에서 개발이 가능해졌다. VS Code에서
  C/C++ 개발 관련 확장을 설치하고, 보다 효율적으로 개발 환경을 구축하는 방법으로
  넘어가 보자.
</p>
<h5>관련 글</h5>
<ul>
  <li>
    <a rel="noopener noreferrer" target="_blank" href="https://www.bitneer.dev/blog/vs-code에-wsl의-c-cpp-개발-환경-설정하기/">VS Code에 WSL의 C/C++ 개발 환경 설정하기</a
    >
  </li>
</ul>
<h5>참고 자료</h5>
<ul>
  <li>
    <a rel="noopener noreferrer" target="_blank" href="https://gcc.gnu.org/">https://gcc.gnu.org/</a
    >
  </li>
  <li>
    <a rel="noopener noreferrer" target="_blank" href="https://clang.llvm.org/">https://clang.llvm.org/</a
    >
  </li>
  <li>
    <a rel="noopener noreferrer" target="_blank" href="https://cmake.org/cmake/help/latest/">CMake Reference Documentation</a
    >
  </li>
  <li>
    <a rel="noopener noreferrer" target="_blank" href="https://ninja-build.org/">https://ninja-build.org/</a
    >
  </li>
  <li>
    <a rel="noopener noreferrer" target="_blank" href="https://github.com/rizsotto/Bear">https://github.com/rizsotto/Bear</a
    >
  </li>
</ul>
<p>The post <a rel="nofollow" href="https://www.bitneer.dev/blog/wsl%ec%97%90-c-cpp-%ea%b0%9c%eb%b0%9c%ec%9d%84-%ec%9c%84%ed%95%9c-%ed%8c%a8%ed%82%a4%ec%a7%80-%ec%84%a4%ec%b9%98%ed%95%98%ea%b8%b0/">WSL에 C/C++ 개발을 위한 패키지 설치하기</a> appeared first on <a rel="nofollow" href="https://www.bitneer.dev">bitneer.dev</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
