Robotics/C++

CMake 디렉토리(경로)를 변수로 받아 사용하기

콩지니어 2023. 1. 4. 15:16
728x90

Visual Studio던 일반적인 CMake던 파일을 읽을 때 필요한 파일 경로와 관련하여 난감한 경험이 해보신 분들은 다들 있을 것 입니다. 절대경로를 코드안에 써놓자니 PC가 바뀌면 손으로 바꿔줘야 하고, 상대경로를 쓰자니 이건 빌드환경에 따라 조금씩 다를 여지가 있어 썩 마음이 놓이지는 않죠.

그나마 Visual Studio는 약간의 장치가 있어서 개발 단계에서는 소스폴더에 읽을 파일이 있어도 빌드 된 실행프로그램이 읽을 수 있도록 되어는 있는데, CMake는 정확하게 맞춰줘야 하죠.

릴리즈까지 대응되는 완벽한 방법은 아니지만, 적어도 CMake에서 매번 경로를 적어줘야 하는 수고를 덜어낼 수 있는 방법을 소개해보고자 합니다.

방식

CMake generation 단계에서는 root 나 source 디렉토리가 어디인지 알 수 있는 점을 이용하여, cmake 단계에서 이를 파일에 자동으로 써두도록 하고, 빌드 시 이 string을 변수로 받아오는 방법 입니다.

일반적으로 cmake에서 자동으로 만들고 빌드시 불러오는 파일은 config.h 로 이름을 정하는 것 같습니다.

방법

우선 CMakeLists.txt 파일 안에 아래 코드를 넣고 저장합니다.

configure_file (${CMAKE_CURRENT_SOURCE_DIR}/config.h.in ${CMAKE_CURRENT_SOURCE_DIR}/config.h @ONLY)

CMake generation이 실행되면 아래와 같이 config.h.in 파일이 없다는 오류를 확인할 수 있습니다.

간단히 설명하면, CMake에서 config.h.in 파일에 적혀있는 양식대로 config.h 파일을 채우는 과정이기 때문에 config.h.in을 우선 만들어 줘야 합니다.

CMakeLists.txt 파일이 있는 같은 디렉토리에 config.h.in 파일을 생성하고 아래 내용을 붙여넣어 저장해 줍니다.

// kongineer.tistory.com
#ifndef CONFIG_H_IN
#define CONFIG_H_IN
 
#define PROJECT_NAME @PROJECT_NAME@ //project name will be written here

#define STR(x) #x //for stringizing
#define CMAKE_SOURCE_DIR STR(@CMAKE_CURRENT_SOURCE_DIR@) //cmake source dir will be written here
 
#endif // CONFIG_H_IN

그리고 다시 CMake generation을 시도하면 정상종료와 함께 config.h 파일이 자동으로 생성됩니다.

자동으로 생성 된 config.h

이 파일을 열어보면 아래와 같이 자동으로 프로젝트명과 cmake 경로가 적혀진 것을 확인할 수 있습니다.

// kongineer.tistory.com
#ifndef CONFIG_H_IN
#define CONFIG_H_IN
 
#define PROJECT_NAME zmq_trial //project name will be written here

#define STR(x) #x //for stringizing
#define CMAKE_SOURCE_DIR STR(F:/developer/cpp_ws/zmq_trial) //cmake source dir will be written here
 
#endif // CONFIG_H_IN

헤더파일이 생겼으니, 이제 cpp 파일에서 불러와 사용하면 됩니다.

#include "config.h"

std::string 타입을 사용하고자 하면 아래와 같이 parse해서 사용하면 됩니다.

auto cmake_src = std::string(CMAKE_SOURCE_DIR);

참고

config.h 중 아래 라인은 메크로 변수의 string화(stringizing)를 위해 필요한 규칙 입니다.

#define STR(x) #x //stringizing

출처: https://gcc.gnu.org/onlinedocs/cpp/Stringizing.html

728x90

'Robotics > C++' 카테고리의 다른 글

[ZeroMQ] C++와 Python 프로그램간 통신 연동 예제  (10) 2023.01.03
CMake와 Eigen 라이브러리 묶기  (0) 2019.01.01