여러개의 파일 만들기
다음과 같이 파일을 만들도록 하겠습니다.
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
공대생지식창고 Github
'Programming Tools > CMake' 카테고리의 다른 글
[CMake] Library Options : 라이브러리에 옵션을 추가하기 (0) | 2021.09.07 |
---|---|
[CMake] Git Submodules/external library(서브모듈, 외부 라이브러리)를 이용하기 (0) | 2021.09.06 |
[CMake] Versioning the Source Code : CMakeLists를 통해 소스코드 버전명 만들기 (0) | 2021.09.06 |
[CMake] Makefile과 CMake (0) | 2021.08.31 |
[CMake] Makefile과 CMake 학습 자료 정리 (0) | 2021.08.26 |