Study: DeveloperTools(DevTool)/DevTool: CMake

[CMake] Window์—์„œ CMake ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ์ ํŠธ ๋งŒ๋“ค๊ธฐ

DrawingProcess 2023. 5. 23. 00:25
๋ฐ˜์‘ํ˜•
๐Ÿ’ก ๋ณธ ๋ฌธ์„œ๋Š” 'Window์—์„œ CMake ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ์ ํŠธ ๋งŒ๋“ค๊ธฐ'์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด๋†“์€ ๊ธ€์ž…๋‹ˆ๋‹ค.
์ œ๋ชฉ ๊ทธ๋Œ€๋กœ Window์—์„œ CMake ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ํ™˜๊ฒฝ ์„ค์ • ๋ฐ ์ด๋ฅผ ์ด์šฉํ•œ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ •๋ฆฌํ•˜์˜€์œผ๋‹ˆ ์ฐธ๊ณ ํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

1. ํ™˜๊ฒฝ ์„ค์ •

1.1 CMake ์„ค์น˜ํ•˜๊ธฐ

์œˆ๋„์šฐ(Windows)์—์„œ CMake๋ฅผ ์„ค์น˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ๋จผ์ € CMake์˜ ๊ณต์‹ ํ™ˆํŽ˜์ด์ง€์—์„œ ๋‹ค์šด๋กœ๋“œ ํŽ˜์ด์ง€๋กœ ์ ‘์†ํ•ฉ๋‹ˆ๋‹ค. 

์œˆ๋„์šฐ์šฉ CMake ์„ค์น˜ ์‹คํ–‰ํŒŒ์ผ์ธ 'cmake-<version>-win64-x64.msi' ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œ ํ•ฉ๋‹ˆ๋‹ค. ์ดํ›„ ๊ธฐ๋ณธ์ ์œผ๋กœ [Next] ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ์„œ ์ญ‰ ์„ค์น˜๋ฅผ ์ง„ํ–‰ํ•˜๋˜ system PATH๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ถ€๋ถ„์—์„œ 'Add CMake to the system PATH for all users'๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

์„ค์น˜๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด cmake ๋ช…๋ น์œผ๋กœ ์„ค์น˜๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

$ cmake
Usage

  cmake [options] <path-to-source>
  cmake [options] <path-to-existing-build>
  cmake [options] -S <path-to-source> -B <path-to-build>

Specify a source directory to (re-)generate a build system for it in the
current working directory.  Specify an existing build directory to
re-generate its build system.

Run 'cmake --help' for more information.

์ด๋•Œ ํ„ฐ๋ฏธ๋„์„ ๊ป๋‹ค๊ฐ€ ํ‚ฌ ๊ฒฝ์šฐ cmake ๋ช…๋ น์„ ์ธ์‹ํ•˜์ง€ ๋ชปํ•˜๋Š”๋ฐ, ์ด๋Š” ์œˆ๋„์šฐ ํŠน์„ฑ์ƒ ํ™˜๊ฒฝ๋ณ€์ˆ˜๊ฐ€ ์ปดํ“จํ„ฐ ์žฌ๋ถ€ํŒ…์„ ํ•ด์•ผ ์ ์šฉ์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ „์›์„ ๋„๊ธฐ ๊ท€์ฐฎ๋‹ค๋ฉด ๋‹ค์Œ์˜ ๋ช…๋ น์„ ํ†ตํ•ด PATH ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ์ ์šฉํ•ด์ฃผ๋ฉด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

$ set PATH="C:\Program Files\CMake\bin\";%PATH%

๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” [Problem Fix] ์œˆ๋„์šฐ ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์žฌ๋ถ€ํŒ… ์•ˆํ•˜๊ณ  ์ ์šฉํ•˜๊ธฐ์— ์„ค๋ช…๋œ ๊ฒƒ์ฒ˜๋Ÿผ ๋‹ค์Œ์˜ ๋ช…๋ น์„ ํ†ตํ•ด ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ค์ •์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

$ taskkill /f /im explorer.exe

1.2 Make ์„ค์น˜ํ•˜๊ธฐ

์œˆ๋„์šฐ(Windows) ํ™˜๊ฒฝ์—์„œ GNU Make๋ฅผ ์„ค์น˜ํ•˜์—ฌ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋˜ํ•œ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. gnuwin32 ํ™ˆํŽ˜์ด์ง€์—์„œ make ๋‹ค์šด๋กœ๋“œ ํŽ˜์ด์ง€๋กœ ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค.

์ดํ›„  ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์†Œ์Šค์ฝ”๋“œ ์—†์ด ๋ฐ”๋กœ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ๋Š” ์„ค์น˜ ํŒŒ์ผ์„ ๋ฐ›๊ธฐ ์œ„ํ•ด [Setup] ๋งํฌ๋ฅผ ๋ˆ„๋ฆ…๋‹ˆ๋‹ค.

https://ndb796.tistory.com/381

๋‹ค์šด๋กœ๋“œ๊ฐ€ ๋๋‹ค๋ฉด ๋ฐ”๋กœ ์„ค์น˜ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜์—ฌ ์„ค์น˜๋ฅผ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ์„ค์ • ๊ทธ๋Œ€๋กœ [Next] ๋ฒ„ํŠผ๋งŒ ๋ˆ„๋ฅด์…”๋„ ์ •์ƒ์ ์œผ๋กœ ์„ค์น˜๋ฉ๋‹ˆ๋‹ค.

์ดํ›„ CMake์™€ ๋‹ฌ๋ฆฌ Make์˜ ์‹คํ–‰ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋กœ ๋“ฑ๋กํ•ด์ฃผ์–ด์•ผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์„ค์น˜๋˜๋Š” ๊ฒฝ๋กœ์ธ 'C;\Program Files (x86)\GnuWin32\bin'๋ฅผ ์‹œ์Šคํ…œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ PATH์— ์ถ”๊ฐ€ํ•ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

https://ndb796.tistory.com/381

์ดํ›„์— ๋ช…๋ น ํ”„๋กฌํ”„ํŠธ(CMD)์—์„œ make -v ๋ช…๋ น์„ ์ž…๋ ฅํ–ˆ์„ ๋•Œ, ๋ฒ„์ „ ์ •๋ณด๊ฐ€ ์ถœ๋ ฅ์ด ๋˜๋ฉด ์ •์ƒ์ ์œผ๋กœ ์„ค์น˜๊ฐ€ ์™„๋ฃŒ๋œ ๊ฒ๋‹ˆ๋‹ค.

2. CMake ํ”„๋กœ์ ํŠธ ์ œ์ž‘ํ•˜๊ธฐ

2.1. CMake & Make ํ”„๋กœ์ ํŠธ ๋นŒ๋“œํ•˜๊ธฐ

์ด์ œ CMake๋กœ ์˜ˆ์ œํ”„๋กœ์ ํŠธ์ธ eigen์„ ๋นŒ๋“œํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

$ git clone https://gitlab.com/libeigen/eigen.git

$ cd eigen
$ mkdir build
$ cd build

$ cmake -DCMAKE_BUILD_TYPE=Debug -G "MinGW Makefiles" -DCMAKE_INSTALL_PREFIX=../install ..
$ make -j4
$ sudo make install

์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์€ cmake ์˜ต์…˜ ์ค‘ -G "MinGW Makefiles" ์ž…๋‹ˆ๋‹ค. ํ•ด๋‹น๋ถ€๋ถ„์„ ๋„ฃ์ง€ ์•Š์œผ๋ฉด ๊ณ„์†ํ•ด์„œ NMake Makefiles๋ฅผ ์ฐพ๊ฒŒ ๋˜์–ด ๊ผญ ํฌํ•จ์‹œ์ผœ์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

2.2. ๋นŒ๋“œํ•œ ํŒŒ์ผ ํ™œ์šฉํ•˜๊ธฐ

์ด์ œ eigen ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋จผ์ € ํ”„๋กœ์ ํŠธ๋ฅผ ์œ„ํ•ด project ํด๋”๋ฅผ ๋งŒ๋“ค๊ฒ ์Šต๋‹ˆ๋‹ค. ์•ž์œผ๋กœ ํ•ด๋‹น ํด๋” ํ•˜์œ„๋กœ example.cpp์™€ CMakeLists.txt๋ฅผ ์ž‘์„ฑํ•  ์˜ˆ์ •์ด๋‹ˆ ์ฐธ๊ณ ํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๋จผ์ € ํ•ด๋‹น ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” example.cpp ํŒŒ์ผ์„ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

#include <iostream>
#include <Eigen/Dense>
 
using Eigen::MatrixXd;
 
int main()
{
  MatrixXd m(2,2);
  m(0,0) = 3;
  m(1,0) = 2.5;
  m(0,1) = -1;
  m(1,1) = m(1,0) + m(0,1);
  std::cout << m << std::endl;
}

์ดํ›„ cpp ํŒŒ์ผ์—์„œ eigen ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋™์ผ ๊ฒฝ๋กœ์— CMakeLists.txtํŒŒ์ผ์„ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. 

cmake_minimum_required (VERSION 3.0)
project (myproject)
 
set(EIGEN3_INCLUDE_DIR "~/eigen/cmake")
include_directories(${EIGEN3_INCLUDE_DIR})

find_package (Eigen3 REQUIRED)
 
add_executable (example example.cpp)
target_link_libraries (example Eigen3::Eigen)

์—ฌ๊ธฐ์„œ EIGEN3_INCLUDE_DIR์ด๋ผ๋Š” ํ™˜๊ฒฝ๋ณ€์ˆ˜์—๋Š” ์•„๊นŒ ๋นŒ๋“œํ•œ eigen ํด๋” ๋‚ด๋ถ€ cmake ๊ฒฝ๋กœ๋กœ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค. 

์ดํ›„ ์•„๊นŒ eigen์„ ๋นŒ๋“œํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ํ•ด๋‹น ์†Œ์Šค์ฝ”๋“œ๋ฅผ ๋นŒ๋“œํ•˜๋ฉด, example์ด๋ผ๋Š” ์‹คํ–‰ํŒŒ์ผ์ด ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

$ mkdir build
$ cd build

$ cmake -DCMAKE_BUILD_TYPE=Debug  -G "MinGW Makefiles" ..
$ make -j4

์ด์ œ build ํด๋” ๋‚ด์— ์ƒ์„ฑ๋œ example ์‹คํ–‰ํŒŒ์ผ์„ ์‹คํ–‰์‹œํ‚ค๋ฉด? ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ฑ๊ณต์ ์œผ๋กœ printํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

$ example
3  2.5
-1 1.5

์ฐธ๊ณ 

๋ฐ˜์‘ํ˜•