코린이의 개발 일지

맥에서 opencv 사용하기 - (c++ 언어 사용, 터미널로 컴파일) 본문

맥북 개발환경 세팅

맥에서 opencv 사용하기 - (c++ 언어 사용, 터미널로 컴파일)

폴라민 2022. 3. 1. 00:55
반응형

 

맥북 사용한지 한달이 되어가고 있는데...

 

여전히 많이 어색합니다 ㅎㅎ 언제쯤 익숙해지려나. 그래도 다행인 점은 이번에 2월 한달간 서울 42 프로그램에서 아이맥으로 공부했어서 리눅스 터미널은 나름 꽤 잘 다룬답니다. 후후

 

이제 42 서울도 끝이 났고  블로그도 재개해 보고자 글을 씁니다. 첫 글은 오늘 하루종일 애먹은 내용으로 해보려고 합니다.

 

 

제가 xcode는 써본적이 없어서 이번에 깔아봤는데, 일단 까는데도 뭔 시간이 그렇게 오래걸리는지, 저는 제 맥북 고장난 줄 알았답니다....

게다가 설치가 된건지 만건지도 모르는 상태에서 실행 해봤는데 사용법 너무 복잡하다... 하.... vscode가 얼마나 좋은 툴이었는지 새삼 깨닫는 중입니다.

 

c랑 c++ 주로 사용하시는 분들은 그냥 윈도우 운영체제 쓰는게 현명할 듯 싶습니다.. visual studio 정말 괜찮은 녀석이었다는 걸 xcode 쓰면서 절실히 깨닫는 중이라

 

뭐 암튼 본론으로 들어가면 제가 작년에 객체지향 프로그래밍 수업에서 팀프로젝트로 만들었던 과제들을 맥북에 좀 옮기고 싶어서 c++ 개발환경 세팅을 좀 했는데, xcode로 시도하다가 결국 그냥 터미널로 했습니다. 하핳

저는 터미널에서 컴파일하는게 훨씬 편한 거 같아요. 익숙해서 그런거겠지만.

 

아무튼 터미널로 opencv사용한 프로젝트 빌드하는 방법은 자료가 잘 없는 거 같아서 글을 몇자 적어봅니다.

 

서론이 길었죠. 시작하겠습니다.

 

 

1. 우선 컴파일 해보자

우선 소스 코드들을 전부 가져왔습니다. 

되게 많죠. 나름 열심히 했던 프로젝트였습니다. opencv를 활용해서 이미지 필터를 만드는 프로젝트 였는데 후에 시간이 된다면 이것도 포스팅 해보도록 하겠습니다.

 

 

아무튼 컴파일에 필요한 모든 소스코드들을 가져왔으니 컴파일을 해야겠죠.

 

원래 c++ 컴파일은 아래와 같은 명령어로 합니다.

 

g++ *.cpp

 

아 저 *.cpp은 cpp로 끝나는 모든 파일들을 컴파일 하겠다는 겁니다. 컴파일 할 때 원래 헤더는 같이 컴파일 하지 않아요!!

 

그러니까 말하자면 

g++ *.cpp 

이건

g++ main.cpp FilterManager.cpp Filter.cpp CustomFilter.cpp Image.cpp ...

이 말과 같아요. 저기있는 모든 cpp 소스코드 파일들을 한꺼번에 컴파일 하겠다는 말입니다. 다 적기 귀찮아서 별 하나로 통째로 컴파일 한거죠.

 

근데 g++ *.cpp  이렇게만 쓰면 오류 천지입니다. 우선 저는 opencv를 맥에 설치 안해서 그것 부터 설치해줬습니다.

 

 

저는 이미 설치해둬서 그냥 업데이트가 되었는데 아무튼 저렇게 

brew install opencv

라고 입력해주시면 됩니다. 이거 설치 어어어어어어엄청 오래하는 거 맞으니까 당황하지 마시고 설치 되는 동안 다른 일 하다 오시면 됩니다. 

(저도 많이 당황했었습니다)

아무튼 설치가 다 끝나면 이제 컴파일 할 코드들이 있는 폴더로 갑니다.

 

명령어를 아래와 같이 치면 opencv 관련 플래그 들이 나옵니다.

이 플래그들을 사용해서 컴파일 해야합니다. 근데 너무 많잖아요. 그래서 매크로 형식으로 붙여줍니다.

 

g++ $(pkg-config --cflags --libs opencv4) *.cpp

 

이렇게 말이죠.

 

근데 이래도 오류 천지가 날겁니다.

당황하셨죠. 저도 많이 당황했는데 오류 메시지 읽어보시면 

warning: deleted function definitions are a C++11 extension

이렇게 나와요. c++ 11로 컴파일 해야겠죠.

 

뒤에 이걸 추가로 붙여준 후 컴파일 해줍니다.

 

g++ $(pkg-config --cflags --libs opencv4) *.cpp -std=c++11

 

네!! 드디어 성공적 컴파일 성공했습니다. 

./a.out 해보시면 잘 실행이 될겁니다. 

 

근데 매번 이거 치기 귀찮잖아요. (저만 그런가요?)

아무튼 그래서 저는 makefile도 만들어 봤답니다.

 

2. Makefile 만들어서 컴파일

 

 

 

우선 파일들이 이렇게 난잡하게 있는 것도 맘에 안들어서 폴더를 따로 만들어 넣어줬습니다.

 

 

 

훨씬 깔끔해졌죠. 헤더 파일들은 headers 폴더에 넣어줬고 cpp파일들은 srcs 폴더에 넣어줬습니다.

images 폴더랑 customs.txt는 그냥 프로그램 작동하는데 필요한 것들이라 지금은 신경 안쓰셔도 됩니다!

 

그럼 makefile을 볼까요?

 

 

 

복잡해 보이는데 그냥 매크로로 하나씩 넣어줬다고 보시면 됩니다.

 

앞에서 그냥 컴파일 할 때 명령어가

g++ $(pkg-config --cflags --libs opencv4) *.cpp -std=c++11

이거였잖아요.

여기서

$(pkg-config --cflags --libs opencv4)

이거 대신 그냥 플래그 직접 다 넣어줬다고 생각하시면 되요.

 

 

makefile 만드는 방법에 대해서는 추후에 더 자세히 다뤄볼게요!

아무튼 이제 컴파일 해보면

 

 

 

이렇게 실행이 잘 됩니다. make를 입력하니까 g++ 플래그들 - I headers/ srcs/*.cpp -std=c++11 -o IMAGE_FILTER

라고 적혀있죠. -I 옵션은 헤더 파일들을 headers폴더에서 찾겠다는 옵션이고, srcs/ 는 cpp 파일들이 거기 있으니까 그냥 디렉토리 명을 붙여줬습니다. 그리고 c++11로 컴파일 할 거라고 붙이고 -o 옵션은 이름을 바꿔주는 겁니다. 원래는 실행파일 이름이 a.out 으로 생기잖아요?

 

근데 저는 그냥 실행 파일 이름을 IMAGE_FILTER로 바꿔줬습니다.

 

별거 없죠?? ㅎㅎ

 

요즘은 makefile 보다 Cmake 많이 쓴다고 하던데, 공부해서 포스팅 해보겠습니다.

 

그럼 다들 즐코 하세요!!

 

반응형
Comments