CMake๋ฅผ ์ด์ฉํ C/C++ ํ๋ก์ ํธ ๋น๋
Makefile์ด๋ผ๋ ๊ฒ์ ํ ๋ฒ ์ฏค์ ๋ค๋ค ๋ค์ด๋ณด์ จ์ ๊ฒ์ด๋ผ ์๊ฐํฉ๋๋ค.
Visual Studio IDE ๋๊ตฌ๋ฅผ ์ด์ฉํ๋ฉด Makefile์ ์คํ๋ ค ๋ณด๊ธฐ ํ๋ค ์ ์๊ฒ ์ง๋ง, Unix, Linux์์ C, C++ ํ๋ก๊ทธ๋๋ฐ์ ํ์ จ๋ค๊ฑฐ๋ ํฌ๋ก์ค ํ๋ซํผ์ผ๋ก ํ๋ก๊ทธ๋๋ฐ์ ํ์ ๋ถ๋ค์ด๋ผ๋ฉด, ํ ๋ฒ ์ฏค์ ๋ค๋ค ์ ํด๋ณด์ จ์ ๊ฒ์ ๋๋ค.
Makefile
์ด ํฌ์คํธ๋ CMake์ ๋ํ ํฌ์คํธ์ด์ง๋ง, ๊ทธ ์ ์ Makefile์ด๋ ๊ฒ์ ๋ํด์ ๋ช ๊ฐ์ง ์ ์ด๋ณด๊ณ ์ ํฉ๋๋ค.
ํน์ ์ ์ ๋ธ๋ก๊ทธ์์ OpenCV ์ค์น์ ๊ด๋ จ๋ ํฌ์คํธ๋ฅผ ๋ณด์ ๋ถ์ด๋ผ๋ฉด, ์๋ง ์ด๋ฐ ๋ด์ฉ์ ๋ณด์ จ์ ๊ฒ์ ๋๋ค.
$ make -j $(nproc)
$ sudo make install
์ฌ๊ธฐ์ ์ค์ ์ ์ธ ์ปค๋งจ๋๋ make ๋ช ๋ น์ด์ ๋๋ค. ์ฌ์ค make ๋ช ๋ น์ด๊ฐ ๋ค์ด๊ฐ .sh ํ์ผ์ ์คํํ์ ์ ์ง์ ์๋ ์ค์นํ๋ ํ๋ก๊ทธ๋จ๋ ์์ต๋๋ค๋ง. ๋๋ถ๋ถ ๋ชจํ๋ make ๋ช ๋ น์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ฒ๋ฆฌํฉ๋๋ค.
Windows์์๋ Mingw๋ Cygwin์ ์ฌ์ฉํด์ GNU Make for Windows ํ๋ก๊ทธ๋จ์ ์ด์ฉํด make ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ ์๋์ผ๋ก ์ค์นํ์ค ์๋ ์๊ธฐ ๋๋ฌธ์, ํน์ Windows ์ฌ์ฉ์๋ผ๋ฉด, ์ด ๋ถ๋ถ์ ์ฐธ๊ณ ํด๋ณด์ ์ ํ ๋ฒ ์ค์ตํด๋ณด์๋ ๊ฒ๋ ๋์์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค.
๋ณธ๋ก ์ผ๋ก ๋์ด๊ฐ์, Makefile์ด ๋ฌด์์ธ์ง ์์๋ณด๊ฒ ์ต๋๋ค. Makefile์ ์ฌ๋ฌ๋ถ๋ค์ด C, C++ ํ๋ก๊ทธ๋๋ฐ์ ํ ๋, ๋ฏธ๋ฆฌ ๋น๋ ํ๊ฒฝ์ ์กฐ์ฑํด๋๋ ์ผ์ข ์ ํ์ผ์ ๋๋ค. ๊ทธ๋ฆผ์ผ๋ก ํ ๋ฒ ๋ณด๋๋ก ํ์ฃ .
๊ทธ์ ํ๋ก์ ํธ ํ๋ ์์ฑํ์ ๋ฟ์ธ๋ฐ, Makefile์ ์์ฒญ๋ ๋ด์ฉ์ ๋๋ฐฐํด๋ฒ๋ฆฐ CLion....
์ ์ฌ์ง์ ์ฐ๋ฆฌ๊ฐ C, C++ ์ฝ๋๋ฅผ ์์ฑํ ํ, ๋น๋๋ฅผ ํ๊ฒ ๋๋ฉด, ์ปดํ์ผ๋ฌ๊ฐ ํ๊ฒ ๋๋ ๊ฐ์ฅ 1๋ฒ์งธ ๊ณผ์ ์
๋๋ค. ๋ฐ๋ก object ํ์ผ์ ์์ฑํ๋ ๊ฒ์ด์ฃ . Visual Studio๋ CLion ๋ฑ์ IDE ํ๋ก๊ทธ๋จ์ ์ฌ์ฉํ๋ฉด ํค๋ณด๋ ๋จ์ถํค ํน์ ๋ง์ฐ์ค ํด๋ฆญ์ผ๋ก ์ด ๋ชจ๋ ๊ฒ์ด ์๋์ผ๋ก ๋์ง๋ง, vim ์๋ํฐ๋ฅผ ์ด์ฉํ๊ฑฐ๋ ํ ๊ฒฝ์ฐ์๋ ์ง์ ์ปค๋งจ๋๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
์์ฑ๋ ๋ชฉ์ ์ฝ๋๋ ํ ๊ณณ์ผ๋ก ๋งํฌ๋์ด ์ต์ข ์ ์ผ๋ก ๋ฐ์ด๋๋ฆฌ ์คํ ํ์ผ์ด ๋๋ ๊ฒ์ ๋๋ค.
๊ทธ๋ผ ์ฐ๋ฆฌ๊ฐ ์ด๋ฅผ ์ปค๋งจ๋๋ก ์ง์ ์์ฑํ๋ค๋ฉด, ์ด๋ป๊ฒ ์์ฑํด์ผํ ๊น์?
$ g++ -c -o main.o main.cc
$ g++ -c -o histogram.o histogram.cc
์ฌ์ง์ ์์ค ์ฝ๋ ํ์ผ์ C++ ์ฝ๋์ด๋ฏ๋ก, g++ ์ปค๋งจ๋๋ฅผ ์ฌ์ฉํ๊ฒ ์ต๋๋ค.
(๋ฌผ๋ก ํ์ฅ์๊ฐ cc๊ฐ ๋์๋ , cpp๊ฐ ๋์๋ , c๊ฐ ๋์๋ ์๊ด์์ด ์์ ์ด๋ค ํค๋ ํ์ผ์ด๋ ์ฝ๋๋ฅผ ์ผ๋ค๋ ๊ฒ์ ๋ฐ๋ผ ๋ค๋ฅด์ง๋ง)
์ ๋ ๊ณผ์ ์ ๊ฐ๊ฐ์ ์ฝ๋๋ฅผ ์ปดํ์ผ๋ง ํ๋ ๊ณผ์ ์ผ๋ก ์ต์ข ์ ์ธ ๋ฐ์ด๋๋ฆฌ ํ์ผ์ ์์ฑ๋์ง ์์ต๋๋ค. ๊ทธ๋ผ ์ต์ข ์ ์ผ๋ก ๋ฐ์ด๋๋ฆฌ ํ์ผ์ ๋ง๋ค๊ธฐ ์ํด์๋ ์ปค๋งจ๋ ํ ๊ฐ๋ฅผ ๋ ์จ์ผํ๋ ๊ฒ์ด ๋๊ฒ ์ฃ ?
$ g++ -o run main.o histogram.o
๋์ถฉ ์ด๋ฐ ์์ ๋๋ค. ๋ณธ๋ main.cc ์์ค ์ฝ๋๊ฐ ํ ๊ฐ๋ง ์์์ ๋๋ ์๋ ์ปดํ์ผ ๊ณผ์ ๋ ๊ต์ฅํ ๊ฐ๋จํ์ง๋ง, ์์ ๊ฐ์ด ์์ค ์ฝ๋๊ฐ ์ฌ๋ฌ ๋ฌถ์์ผ๋ก ๋์ด ์๋ ๊ฒฝ์ฐ์๋ ์ด์ผ๊ธฐ๊ฐ ๋ค๋ฆ ๋๋ค. (์์์๋ 2๊ฐ๊ฐ ๋์ด์ง๋ง, ๊ทธ๊ฒ๋ณด๋ค ๋ ๋ง์์ง๋ค๋ฉด?, ๋ญ ๊ทธ ๋๋ ์ ํ๋ก๊ทธ๋๋ฐ์ ํด์ผ๊ฒ ์ฃ ....;;)
Makefile์ ์ค์์ฑ
๋๋ถ๋ถ์ ๊ฐ๋ฐ์๋ค์ด IDE ํ๋ก๊ทธ๋จ์๋ง ์ต์ํด์ ธ ์๋ค ๋ณด๋ ์ด๋ฐ ์ค์ํ ๋ถ๋ถ์ ๊ฐ๋ ๋์น๊ธฐ ๋ง๋ จ์ ๋๋ค. ํ์ง๋ง, ์๋ฒ ๋๋ํ๋ก๊ทธ๋๋ฐ์ ํ๋ค ๊ฑฐ๋ GUI ํ๊ฒฝ์ ์ฌ์ฉํ ์ ์๋ค๊ฑฐ๋, ์ด๋ฐ ๊ทนํ์ ์ํฉ์ด ์ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊น์?
์ ์๋๋ก๋ผ๋ฉด, ์ ์ปค๋งจ๋๋ฅผ ์ผ์ผ์ด ๋ค ๋๋ ค์ ์ ๋ ฅํด์ผ ํฉ๋๋ค. ํ์ง๋ง ์ผ๋ง๋ ๋ฒ๊ฑฐ๋ก์ด๊ฐ์... (์ด๋ ๊ฒ๋ ์ฌํ์๊ฐ.)
์๋๋ฉด, ์ ์คํฌ๋ฆฝํธ๋ฅผ ์ง๋ณด๋๋ก ํ ๊น์?
#!/bin/sh
g++ -c -o main.o main.cc
g++ -c -o histogram.o histogram.cc
g++ -o run main.o histogram.o
์ ์ด๋ ๊ฒ ์์ฑํด๋ ๋์์ง ์๊ฒ ๊ตฐ์. ๊ทธ๋ฐ๋ฐ, ์ IDE ๋๊ตฌ๋ ์ ์คํฌ๋ฆฝํธ๊ฐ ์๋ Makefile์ ์ฐ๋ ๊ฒ์ผ๊น์?
Makefile์๋ ์ ์คํฌ๋ฆฝํธ๊ฐ ๊ฐ์ง๊ณ ์์ง ์์ Incremental build ๊ธฐ๋ฅ์ด ์๋ ๊ฒ์ ๋๋ค. ์ด ๊ธฐ๋ฅ์ ๋ด ํ๋ก์ ํธ์ ์ ๋ง์ ์์ค ์ฝ๋ ์ค ๋ฐ๋ ๋ถ๋ถ๋ง์ ๊ณจ๋ผ๋ด์ ์ฌ๋น๋ํ๋ ๊ธฐ๋ฅ์ผ๋ก ์๋ฒ ํ๋ก๊ทธ๋๋ฐ์ ํ๊ฑฐ๋ ๊ฒ์ ํ๋ก๊ทธ๋๋ฐ๊ณผ ๊ฐ์ ๋๊ท๋ชจ ํ๋ก์ ํธ์ ํ๋ก๊ทธ๋๋ฐ์์๋ ๊ต์ฅํ ์ค์ํ ๊ธฐ๋ฅ์ด๊ธฐ๋ ํฉ๋๋ค.
๊ธฐ๋ณธ์ ์ธ Makefile์ ์๋์ ๊ฐ์ด ์์ฑ๋ฉ๋๋ค.
CC=g++
CFLAGS=-g -Wall
OBJS=main.o histogram.o
TARGET=run
$(TARGET): $(OBJS)
$(CC) -o $@ $(OBJS)
main.o: histogram.cc main.cc
histogram.o: histogram.cc
๊ฐ๋จํ ์ค๋ช ๋๋ฆฌ์๋ฉด, CC๋ ๊ฐ๋ฐ์๊ฐ ์ฌ์ฉํ ์ปดํ์ผ๋ฌ ๋ช ๋ น์ด์ ๋ณ์๋ก, FLAGS๋ ๋ค์ ๋ค์ด๊ฐ๋ ์ธ์ ๊ฐ์ ๋ณ์๋ก, OBJS๋ ์ค๋ธ์ ํธ ํ์ผ๋ช ์ ๋ณ์๋ก ๋ํ๋ธ ๊ฒ์ ๋๋ค. ์คํฌ๋ฆฝํธ ์ธ์ด๋ ์ ์ฌํ๊ธฐ ๋๋ฌธ์ ๋ณ์ ์ ์ธ์๋ ์๋ฃํ๊ณผ ๋ฌด๊ดํ๊ฒ ๊ทธ๋ฅ ์ ์ธ์ ํด์ฃผ๊ณ , ์ฌ์ฉํ ๋๋ $๋ฅผ ๋ถ์ฌ์ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ , ์ ์ฝ๋์์ ์ฌ์ฉํ ๋ณ์๋ make ํ๋ก๊ทธ๋จ์ ๋ด์ฅ๋์ด ์๋ ๋ด์ฅ ๋ณ์์ด๋ฏ๋ก, ์ฐธ๊ณ ๋ฐ๋๋๋ค.
CMake
๊ทธ๋ผ CMake๋ ๋ฌด์์ผ๊น์? ๋ณด๋ค์ํผ ๊ฐ๋จํ Makefile์ ์์ฑ์ ์ฌ์ ์ต๋๋ค. ํ์ง๋ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฐ๋ ๋ฑ์ด๋ ํ์ผ์ด ์ปค์ง๊ฒ ๋ ๊ฒฝ์ฐ, Makefile์ ์ฝ๋ ์๋ ๊ทธ๋งํผ ์ฆ๊ฐํ๊ฒ ๋๋ฉฐ ํ๋ก๊ทธ๋๋จธ๊ฐ ์ง์ ๊ด๋ฆฌํ๊ธฐ๊ฐ ๋๋ฌด ์ด๋ ค์์ง๊ฒ ๋ฉ๋๋ค.
๊ทธ๋์ ์ฐ๋ฆฌ๋ ์ ์ฌ์ง์ฒ๋ผ ์ค์ฌ์ ์ฐ๊ธฐ๋ก ํ์ต๋๋ค. (ํ... ์ด๋ ๊ฒ ๊ฐ๋จํ ์๊ฐ)
JetBrains CLion ํ๋ก๊ทธ๋จ์ CMake๋ฅผ ์ฌ์ฉํฉ๋๋ค.
CMake ๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ
๋จผ์ CMake ์ฝ๋๋ฅผ ์์ฑํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
add_executable(run main.o histogram.o)
๋ฑ ์ด ํ ์ค๋ง ์์ฑํด๋ด ๋๋ค. ๊ทธ๋ฆฌ๊ณ CMakeLists.txt ํ์ผ๋ก ์ ์ฅํ ํ, ์๋ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ๋ฉด...
$ cmake CMakeLists.txt
๊ทธ๋ผ ์ฑ๊ณต์ ์ผ๋ก Makefile์ ๋ง๋ค์ด์ค๋๋ค.
๊ทธ๋ฐ๋ฐ, ๋๋๊ฒ๋ Makefile ์์๋ ์ฐ๋ฆฌ๊ฐ ์ผ๋ Add_Executable ์ธ์ ๋ค๋ฅธ ์ฌ๋ฌ๊ฐ์ง๊ฐ ์๋์ผ๋ก ์์ฑ๋ ๊ฒ์ ๋ณด์ค ์ ์์ต๋๋ค.
๊ทธ๋์ CLion ๋ฑ์ IDE ํ๋ก๊ทธ๋จ์์๋ CMakeLists.txt ํ์ผ๋ง ํ ๋ฒ ์์ ํ๊ฒ ๋๋ฉด, ์๋์ผ๋ก Makefile์ด ๋ฐ๋๊ฒ ๋๊ธฐ ๋๋ฌธ์ ์ฌ์ค์ ์ฐ๋ฆฌ๊ฐ ์ด๋ ๊ฒ ๋ณต์กํ Makefile์ ๊ณ ์น๊ฑฐ๋ ๋ฐ๊พธ๋ ์ผ์ด ์์ด ์ฝ๊ฒ C, C++ ํ๋ก๊ทธ๋๋ฐ์ด ๊ฐ๋ฅํ ๊ฒ์
๋๋ค.
CMake ์์ฉ
๊ทธ๋ผ CMake๋ฅผ ์์ฉํด์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ถ๊ฐ ๋ฑ์ ํ ๋ฒ ์์๋ณด๊ฒ ์ต๋๋ค.
์๋ฅผ ๋ค์ด, ์ฐ๋ฆฌ๊ฐ C++์์ Boost ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด, ์๋์ ์ปค๋งจ๋๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
g++ main.cc -o run -l boost_thread -l boost_system
์์ค ์ฝ๋๊ฐ main.cc ํ์ผ์ด๋ผ๊ณ ํ ๋, Boost ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ Thread์ system์ ์ฌ์ฉํ๊ณ ์ ํ๋ค๋ฉด, l ์ธ์ ๊ฐ์ ์ฌ์ฉํด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋งํฌํด์ค์ผ ํฉ๋๋ค.
cmake_minimum_required(VERSION 3.6)
# ๊ณตํต ๋ผ์ด๋ธ๋ฌ๋ฆฌ, ํจํค์ง
find_package(Boost 1.60 COMPONENTS system filesystem thread REQUIRED)
include_directories($(Boost_INCLUDE_DIRS))
target_link_libraries(hoGarden ${SOURCE_FILES})
๋ง๋ถ์ฌ์ filesystem๊น์ง ์ฌ์ฉํ๋ ค๊ณ ํ๋ค๋ฉด, find_package์ filesystem์ ๋ฃ์ด์ฃผ๋ฉด ๋ฉ๋๋ค.
๊ทธ ์ธ์ ์ปดํ์ผ ์ต์ ์ ๊ณตํต์ผ๋ก ์ฃผ๊ฑฐ๋ ํ๋ก์ ํธ ๋ฒ์ ์ ๋ช ์ํ๋ ๋ฑ ๋ค์ํ ์ฝ๋๋ฅผ ์์ฑํ์ค ์๋ ์์ต๋๋ค.
cmake_minimum_required(VERSION 3.6)
# ํ๋ก์ ํธ ์ ๋ณด.
project(hoGarden)
set(PROJECT_VERSION_MAJOR 0)
set(PROJECT_VERSION_MINOR 1)
# CMake C++11
set(CMAKE_CXX_STANDARD 11)
# ์ปดํ์ผ๋ฌ
set(CMAKE_C_COMPILER "g++")
# ๋งํฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
LINK_LIBRARIES(boost_thread boost_asio)
# ์ปดํ์ผ ์ต์
ADD_COMPILE_OPTIONS(-g -Wall)
set(CMAKE_EXE_LINKER_FLAGS "-static -Wl, --gc-sections")
# ๊ณตํต ํค๋ ํ์ผ, ํจํค์ง
find_package(Boost 1.60 COMPONENTS system filesystem thread REQUIRED)
include_directories($(Boost_INCLUDE_DIRS))
set(SOURCE_FILES main.cpp)
add_executable(hoGarden ${SOURCE_FILES})
target_link_libraries(hoGarden ${SOURCE_FILES})
๋ง์น๋ฉฐ...
IDE ํ๋ก๊ทธ๋จ๋ง์ ์ฌ์ฉํ๋ค๊ฐ make๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ ์ด๋ฐ์ ๋ฐ ํท๊ฐ๋ฆฌ๊ณ , ์ด๋ ค์ด ๊ตฌ์์ด ๋ง์ ๋ธ๋ก๊ทธ์ ์ ๋ฆฌํ๊ฒ ๋์์ต๋๋ค.
์๋ฌด๋๋ ๋ฐ์ด๋๋ฆฌ ํ์ผ์ ์ฌ์ฉํด์ ์ฝ๊ณ ๊ฐ๋จํ๊ฒ ์ค์น ํจํค์ง๊ฐ ์ ๊ณต๋๋ค๋ฉด ๋ํ ์์ด ์ข๊ฒ ์ง๋ง, ์คํ ์์ค ํ๋ก๊ทธ๋จ์ ์ง์ ์ง๋ณด๊ณ , ์์ ํ๊ณ , ํ ์คํธํ ๋ (ํนํ C, C++ ์ธ์ด)๋งํผ์ IDE ํ๋ก๊ทธ๋จ์ ์ฌ์ฉํ๊ธฐ ๋ณด๋ค๋ ์ง์ make ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํด ํ ์คํ ํ๊ฒฝ์ ๊ตฌ์ถ ํด์ผํ๋ ๊ฒฝ์ฐ๊ฐ ๋น๋ฒํ ์๊ธฐ๊ฒ ๋ฉ๋๋ค.
๋ฌด์๋ณด๋ค ์ด๋ฐ ํ๋ก์ ํธ์ ์ค์ ๋ฐฉ๋ฒ์ ์์๋๋ฉด, ๋์ค์ ์ผ์ผ์ด ์ฐพ์ ์ปดํ์ผํ์ง ์์๋ ํ ๋ฒ ์์ฑํด๋์ผ๋ฉด ์ฌ๋ฌ๋ชจ๋ก ํธ๋ฆฌํด์ง๋ ์์๋๋ ๊ฒ๋ ๋์์ง ์๋ค ์๊ฐํด๋ด ๋๋ค.
'Programming > C++' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[GP] Unix Thread์ ๊ธฐ๋ณธ์ ๋ค์ ธ๋ณด์ (0) | 2017.06.26 |
---|---|
[GP] Boost Library ์ค์น์ ์ฌ์ฉ (0) | 2017.03.05 |
chkmd5 (ํ์ผ MD5 ํด์๊ฐ ๊ฐ์ ธ์ค๋ ํ๋ก๊ทธ๋จ, only Windows OS) (0) | 2017.01.26 |
System Call Function VS Library Call Function (0) | 2016.12.26 |
GCC Stack Smashing Protector (0) | 2016.04.03 |