포트폴리오 만들기

14.CMake/MemoryLeak/system(cmake)

Roka_is_back 2024. 1. 18.

1.CMake

Window에서 make 명령어 쓰기

https://gnuwin32.sourceforge.net/packages/make.htm

 

Make for Windows

• Complete package, except sources Setup  3384653 25 November 2006  8ae51379d1f3eef8360df4e674f17d6d

gnuwin32.sourceforge.net

 

1.설치한다.

2.시스템 환경 변수 path 에 gnuwin\bin 경로를 넣어준다.

3.cmd 창에서 make -v 쳤을때 사진과 같게 나오면 설치된 것.

참고: https://ndb796.tistory.com/381

 

윈도우(Windows)에서 make 명령 사용하기

윈도우(Windows) 환경에서 GNU Make를 설치하여 이용하는 방법은 매우 간단합니다. ▶ 설치 경로: http://gnuwin32.sourceforge.net/packages/make.htm 다음과 같이 소스코드 없이 바로 설치할 수 있는 설치 파일을

ndb796.tistory.com

 

CMake 설치

https://ndb796.tistory.com/365

 

윈도우(Windows)에서 CMake 설치하는 방법

C언어 프로젝트는 빌드(Build)를 위한 순서를 Makefile을 이용해서 명시하곤 합니다. 이를 더욱 간단하게 만들기 위해서 CMake라는 도구가 도입되었습니다. 다시 말해 CMake는 대표적인 C/C++ 프로젝트

ndb796.tistory.com

 

cmd 창에 cmake 쳤을때 아래와 같이 나오면 성공

 

TestCode

CMake 사용해서 Make 파일 만든 후 Build 하기

 

https://modoocode.com/332

1. CMakeLists를 만든다. 이때 같이 빌드하고자 하는 코드와 같은 경로에 있어야 한다.

 

project의 첫번째 요소 (RokaProj) 를 제외하고는 생략해도 된다. 

Languages의 경우 기본이 c, cxx 이다.

 

생성할 실행 파일을 추가하는 명령 add_executable 

https://modoocode.com/332

 

컴파일 옵션 지정하기

https://modoocode.com/332

컴파일 옵션을 지정할 수 있다.

경고 수준을 조절한다던가 할 수 있는데 Public은 실행 파일 빌드할 때는 별로 중요하지 않다.

 

CMake 기본 개념 Target / Property

target 은 프로그램을 구성하는 요소들. 실행파일,라이브러리 파일 등..

CMake의 모든 명령은 타겟을 기준으로 돌아간다.

각 타겟은 속성(Property)를 정의할 수 있다.

 

Include 경로 지정하기

#include <> system 경로

#include "" 현재 코드 기준으로 경로.

 

헤더 파일들의 경로가 동일하지 않은 경우 해당 파일들을 찾기 위해 컴파일시 따로 경로를 지정해줘야함.

https://modoocode.com/332

 

2.build 파일을 생성하여 그곳을 경로로 cmd창 -> cmake [CMakeLists 경로] 를 입력한다.

경로를 따로 두는 이유는 여러 파일을 생성하기 때문에 프로젝트가 지저분하게 보일 수 있으며

이름이 같은 경우 덮어쓰기 하면 정말 큰일이 나기 때문이다.

 

위 이미지는 cmake .. 인 이유는 build 파일 상위 경로에 CMakeLists 가 위치해 있기 때문.

 

3. 빌드 (리눅스 / 윈도우)

리눅스라면 2번을 수행한 뒤 MakeFile이 만들어져서 cmd창에 make를 입력하면 빌드가 된다.

나는 윈도우이기 때문에 다른 방식을 선택해야 한다.

 

이렇게 하면 .exe 파일이 잘 생성됨을 볼 수 있다.

실행파일 이름이 program인 이유는 CMakeLists에서 실행파일 명을 저렇게 했기 때문임.

실행도 잘 된다.

 

참고의 1,2 설명에 의하면 Window의 경우 ALL_BUILD.vcxproj 파일을 열어 솔루션 빌드를 눌러야 한다고 한다.

또 cmd로 cmake 명령을 이용해 파일을 바로 빌드 할 수 있는 방법도 설명해준다. (그것이 cmake --build ./)

 

 

TestCode2 - 라이브러리

CMake 명령어를 알아가면서 코드를 짜서 어렵기도 했고,

일반적인 라이브러리 예제가 아닌 내 코드에 적용하려고 하니까 오래걸렸다.(A Dll,B Dll, B에서 A lib 로드.)

 

Script CMake 명령어 파일

문제 발생

"a.lib 파일을 열 수 없습니다."  라고 계속 링크에러가 뜨는 것이다.

인터넷에서는 나오지 않았고 스스로 해결했다.

 

해결법

cmd로 빌드할 때 h 파일에 pragma comment 가 있으면 안되는건가 해서 주석을 걸어놓고 빌드를 돌려보았고 잘 수행되었다.

빌드가 잘 됨.

그런데 무작정 주석을 걸어버리면 Script는 별 문제가 없을 수 있지만 RokaSTL_Lib 프로젝트를 링크하는 다른 프로젝트에서는 openssl.lib를 링크하지 못해서 오류가 발생할 것이다.

 

그래서 생각해낸 방법이 솔루션 빌드의 경우와 cmake 빌드의 경우를 나누도록 했다.

아래의 이미지를 보면 _NOT_CMAKE_BUILD 라는 매크로가 있다.

솔루션 빌드의 경우 저 전처리기를 모두 등록해두었기 때문에 솔루션 빌드시에는 해당 링크 코드가 활성화 된다.

 

CMAKE 빌드의 경우 매크로를 등록시켜두지 않았기 때문에 해당 부분은 제외하고
CMake 명령어 자체에서 링크 작업을 수행한다.

등록 안해놨다.
cmake에서 직접 링크 작업을 수행한다.

 

경로 설정

현재 출력 파일의 경로는 RKEngine/Project/Script/build/Debug 이다.

다른 프로젝트에서 사용하려면 RKEngine/External/Dll/Debug/Script로 가야한다.

출력 경로 설정 dll,lib

 

하지만 cmd 빌드를 하면 Debug 파일이 생기고 그 안에 출력되기 때문에 RKEngine/External/Dll/Debug/Script/Debug 가 되어버린다.

귀찮겠지만 경로 규칙을 변경하도록 하고 링크도 Debug용과 Release용으로 나누어 코드를 작성하도록 한다.

변경된 경로 규칙 : RKEngine/External/Dll/Script/Debug (Dll의 dll과 lib에 대해서만 적용.)

 

테스트

1.Console TestCode - ScriptManagerMain ( Engine,Script dll Load 및 함수 호출)

잘된다.

2.Window mode - MainManager

dll load를 무사히 마치고 원하는 동작을 잘 수행한다.

잘된다.

 

참고1: https://jaksam.tistory.com/54

 

Windows 상에서 Cmake로 간단히 빌드해서 출력해보기

https://google.github.io/googletest/quickstart-cmake.html Quickstart: Building with CMake GoogleTest - Google Testing and Mocking Framework google.github.io 우선 google test를 개인적인 프로젝트에 적용해보고자 cmake로 빌드하는 과정

jaksam.tistory.com

참고2: https://stackoverflow.com/questions/61067159/how-to-configure-cmakelists-to-use-windows-command-line-compiler-instead-of-visu

 

How to configure CMakeLists to use Windows command line compiler instead of Visual Studio

I would like to convert my project from a Visual Studio solution to build with CMake and compile it with Makefiles. This is a 2-part question. Right now the CMakeLists.txt is: cmake_minimum_requ...

stackoverflow.com

참고3: https://modoocode.com/332

 

씹어먹는 C++ - <19 - 2. C++ 프로젝트를 위한 CMake 사용법>

모두의 코드 씹어먹는 C++ - <19 - 2. C++ 프로젝트를 위한 CMake 사용법> 작성일 : 2021-02-24 이 글은 94546 번 읽혔습니다. 에 대해서 다루어 보겠습니다. 안녕하세요. 지난번 글에서 make 빌드 시스템을 위

modoocode.com

참고4: https://www.tuwlab.com/ece/27260

 

[CMake 튜토리얼] 2. CMakeLists.txt 주요 명령과 변수 정리 - ECE - TUWLAB

▶ 이 글에서는 CMake 빌드 스크립트인 CMakeLists.txt 파일을 작성하는 방법에 대해 다룹니다. CMake 2.8.x 버전 기준이며, C언어 프로젝트를 기준으로 자주 사용되는 명령과 변수들을 선별하여 기능에

www.tuwlab.com

2. MemoryLeak

ScriptReLoad가 가지고 있는 mScriptMap을 innserClear() 설정을 안해줘서 내부에서 삭제 작업이 일어나지 않아서 발생.

innerClear 추가
릭 없음.

3.System CMake

visual studio 는 cmake를 인지하지 못한다.

 

시스템 변수를 만듦
추가 포함 디렉터리에 cmake.exe 경로를 넣는다.

이렇게 하면 system(cmake) 를 수행해도 cmake 명령어를 잘 인지한다.

안하면 cmake 명령어 자체가 뭔지 몰라서 잘못된 입력값이라고 뜸.

 

https://stackoverflow.com/questions/58773901/configure-cmake-version-in-visual-studio-2019

 

Configure CMake version in Visual Studio 2019

Is there a way to configure the Visual Studio 2019 integrated CMake version? There are features in the latest CMake version that I would like to use, but I'm forced to build from the command line i...

stackoverflow.com

https://studium-anywhere.tistory.com/47

 

[OpenCV] OpenCV 환경변수 설정과 Visual Studio 설정

지난번에는 visual studio에서 설정하는 것만 확인했다. [OpenCV]OpenCV란 무엇인가? 그리고 설치 [OpenCV]OpenCV란 무엇인가? 그리고 설치 1. OpenCV OpenCV는 Open Source Computer Vision의 약자로 영상 처리에 사용할

studium-anywhere.tistory.com

Debug중에 lib,dll 파일을 교체하려고 하면 문제가 발생한다.

이 문제는 FreeLibrary로 거의 해결했다. 덮어쓰기 하기전에 Free 하면 되는 것.

 

그러나 문제는 .pdb가 해제가 되지 않아서 액세스 오류가 뜨며 덮어쓰기를 못하는것..

.pdb는 program debug database라고 하는데 디버그 를 끝내야만 해제되는 듯 하다.

사실 디버깅하지 않고 그냥 ctrl + f5 누르면 충돌없이 잘 실행된다.

 

흠 reload 작업은 runtime에 필요한거지 디버깅중에 필요한건 아니긴 하다.

지금은 내가 엔진을 개발하고 있기 때문에 디버깅이 필요한거지만 

엔진을 사용하는 사용자라고 생각했을땐 내가 엔진을 디버깅하진 않을것이고

엔진 사용중에 Script만 고쳤다가 다시 엔진으로 돌아갔을때 reload가 발생하는걸 원하는 것이니 문제가 없을 것 같다.

또 내가 엔진을 구현중에 있을때도 디버그 돌리는 상태에서 코드를 수정하진 않을테니 reload를 하지 않을것이다.

 

이 부분은 좀 더 생각해보고 다른거 구현중에 문제가 생긴다면 그때 다시 생각해보도록 한다.

댓글