Programming Tools/CMake

[CMake] 여러 개의 파일로 빌드하기

LiDARian 2021. 9. 2. 13:00
반응형

 

여러개의 파일 만들기

 

다음과 같이 파일을 만들도록 하겠습니다.

 

main.cpp

#include <iostream>
using namespace std;

float add(float a, float b);


int main(){
   cout << "Hello" << '\n';
   cout << add(72.1, 73.8) << '\n';
   return 0;
}

 

adder.cpp

using namespace std;

float add(float a, float b){
   return (a + b);
}

 

o유심히 읽어봐야할 CMakeLists.txt

cmake_minimum_required(VERSION 3.21.1)

project(OLAS) # 프로젝트명 : 실행파일 이름이 된다.
add_executable(${PROJECT_NAME} main.cpp adder.cpp) # 프로젝트명을 실행파일 이름으로 한다. 빌드 대상은 main.cpp

 

그러고 다음과 같이 명령을 터미널에 쳐주면 됩니다.

cmake -S . -B out/build
make -C out/build
out/build/OLAS

 

그럼 OLAS가 잘 실행됩니다.

 


 


여러 개의 파일을 라이브러리로 만들어서 빌드하기

 

이번에는 라이브러리를 만들어서 빌드하겠습니다.
ADDER라는 폴더를 새로 만들고, 그곳에 adder.cpp를 넣습니다.

adder.h를 생성하고 아래와 같이 함수를 선언만 합니다.

float add(float a, float b);

 

그리고 Adder 폴더에 CMakeLists.txt를 새로 하나 더 만든다. 그리고 그 파일에 다음과 같이 적어준다.

# 프로젝트 내에서 추가로 만들 라이브러리
add_library(adder adder.cpp)

 

최상단 레벨의 CMakeLists.txt에서는 다음과같이 파일을 만들어준다. 각 명령의 의미는 주석처리를 해놓았다.

cmake_minimum_required(VERSION 3.21.1)

# 프로젝트명 : 실행파일 이름이 된다.
project(OLAS)

# 빌드해서 나올 것들. 프로젝트명을 실행파일 이름으로 한다. 빌드 대상은 main.cpp
add_executable(${PROJECT_NAME} main.cpp)

# 빌드할 라이브러리 지정. 하위폴더를 지정
add_subdirectory(Adder)

# 헤더파일을 추가하는 곳을 지정. #include "Adder/adder.h"라고 안적을 수 있다.
target_include_directories(${PROJECT_NAME} PRIVATE Adder)

# 링크할 라이브러리를 찾는곳. 디렉토리를 빌드하기 위해 경로를 지정한다. 이때 경로는 build된 파일이 있는 경로. 즉, out/build 기준이다.
target_link_directories(${PROJECT_NAME} PRIVATE Adder)

# exe파일에 링크할 라이브러리
target_link_libraries(${PROJECT_NAME} adder)

여기서 PRIVATE, PUBLIC의 차이를 간략히 설명하자면,  A 라이브러리가 B 라이브러리를 이용할 경우 A 는 B 의 컴파일 옵션들과 헤더 파일 탐색 디렉토리 목록을 상속받습니다.

이 때, PUBLIC 으로 설정된 것은 물려 받고, PRIVATE 으로 설정된 것은 물려받지 않습니다.

 

라이브러리 A를 B에서 참조한다고 할 때
A 를 헤더 파일과 구현 내부에서 모두 사용한다면 : PUBLIC
A 를 내부 구현에서만 사용하고 헤더 파일에서는 사용하지 않는다면 : PRIVATE
A 를 헤더 파일에서만 사용하고 내부 구현에서는 사용하지 않는다면 : INTERFACE
로 명시하시면 됩니다.

 

위와 같이 빌드 관계를 만들고, main.cpp는 다음과 같이 바꿔주자

#include <iostream>
#include <adder.h>
using namespace std;


int main(){
   cout << "Hello" << '\n';
   cout << add(72.1, 73.8) << '\n';
   return 0;
}

 

adder.cpp도 다음과 같이 적자.

#include "adder.h"

using namespace std;

float add(float a, float b){
   return (a + b);
}

 

이렇게하고 터미널에

cmake -S . -B out/build
make -C out/build

하면 컴파일이 완료된다. 그리고 out/build/OLAS를 쳐주면 잘 나온다.


 참고 #include <> 와 #include “” 의 차이

해당 헤더파일이 존재하는 경로의 차이이다. 해당 헤더파일이 존재하는 경로에 따라 알맞게 <> ,""를 사용하도록 하자.

#include <>
컴파일러가 설치된 폴더에서 헤더파일을 찾게되는 명령이다.
stdio.h나 iostream이 대표적이다.

#include ""
같은 프로젝트 폴더나 추가포함 디렉터리로 지정해준 경로에서 찾으라는 명령이다.

 

 


공대생지식창고 오픈카톡방

https://open.kakao.com/o/swnAyLyc

 

공대생지식창고님의 오픈프로필

공대생에게 도움이 될만한 글을 씁니다. www.knowledgeforenginners.tistory.com

open.kakao.com

 

공대생지식창고 Github

engineerJPark (github.com)

 

engineerJPark - Overview

engineerJPark has 2 repositories available. Follow their code on GitHub.

github.com

 

 

반응형