1.CMake
Window에서 make 명령어 쓰기
https://gnuwin32.sourceforge.net/packages/make.htm
1.설치한다.
2.시스템 환경 변수 path 에 gnuwin\bin 경로를 넣어준다.
3.cmd 창에서 make -v 쳤을때 사진과 같게 나오면 설치된 것.
참고: https://ndb796.tistory.com/381
CMake 설치
https://ndb796.tistory.com/365
cmd 창에 cmake 쳤을때 아래와 같이 나오면 성공
TestCode
CMake 사용해서 Make 파일 만든 후 Build 하기
1. CMakeLists를 만든다. 이때 같이 빌드하고자 하는 코드와 같은 경로에 있어야 한다.
project의 첫번째 요소 (RokaProj) 를 제외하고는 생략해도 된다.
Languages의 경우 기본이 c, cxx 이다.
생성할 실행 파일을 추가하는 명령 add_executable
컴파일 옵션 지정하기
컴파일 옵션을 지정할 수 있다.
경고 수준을 조절한다던가 할 수 있는데 Public은 실행 파일 빌드할 때는 별로 중요하지 않다.
CMake 기본 개념 Target / Property
target 은 프로그램을 구성하는 요소들. 실행파일,라이브러리 파일 등..
CMake의 모든 명령은 타겟을 기준으로 돌아간다.
각 타겟은 속성(Property)를 정의할 수 있다.
Include 경로 지정하기
#include <> system 경로
#include "" 현재 코드 기준으로 경로.
헤더 파일들의 경로가 동일하지 않은 경우 해당 파일들을 찾기 위해 컴파일시 따로 경로를 지정해줘야함.
2.build 파일을 생성하여 그곳을 경로로 cmd창 -> cmake [CMakeLists 경로] 를 입력한다.
경로를 따로 두는 이유는 여러 파일을 생성하기 때문에 프로젝트가 지저분하게 보일 수 있으며
이름이 같은 경우 덮어쓰기 하면 정말 큰일이 나기 때문이다.
위 이미지는 cmake .. 인 이유는 build 파일 상위 경로에 CMakeLists 가 위치해 있기 때문.
3. 빌드 (리눅스 / 윈도우)
리눅스라면 2번을 수행한 뒤 MakeFile이 만들어져서 cmd창에 make를 입력하면 빌드가 된다.
나는 윈도우이기 때문에 다른 방식을 선택해야 한다.
이렇게 하면 .exe 파일이 잘 생성됨을 볼 수 있다.
실행도 잘 된다.
참고의 1,2 설명에 의하면 Window의 경우 ALL_BUILD.vcxproj 파일을 열어 솔루션 빌드를 눌러야 한다고 한다.
또 cmd로 cmake 명령을 이용해 파일을 바로 빌드 할 수 있는 방법도 설명해준다. (그것이 cmake --build ./)
TestCode2 - 라이브러리
CMake 명령어를 알아가면서 코드를 짜서 어렵기도 했고,
일반적인 라이브러리 예제가 아닌 내 코드에 적용하려고 하니까 오래걸렸다.(A Dll,B Dll, B에서 A lib 로드.)
문제 발생
"a.lib 파일을 열 수 없습니다." 라고 계속 링크에러가 뜨는 것이다.
인터넷에서는 나오지 않았고 스스로 해결했다.
해결법
cmd로 빌드할 때 h 파일에 pragma comment 가 있으면 안되는건가 해서 주석을 걸어놓고 빌드를 돌려보았고 잘 수행되었다.
그런데 무작정 주석을 걸어버리면 Script는 별 문제가 없을 수 있지만 RokaSTL_Lib 프로젝트를 링크하는 다른 프로젝트에서는 openssl.lib를 링크하지 못해서 오류가 발생할 것이다.
그래서 생각해낸 방법이 솔루션 빌드의 경우와 cmake 빌드의 경우를 나누도록 했다.
아래의 이미지를 보면 _NOT_CMAKE_BUILD 라는 매크로가 있다.
솔루션 빌드의 경우 저 전처리기를 모두 등록해두었기 때문에 솔루션 빌드시에는 해당 링크 코드가 활성화 된다.
CMAKE 빌드의 경우 매크로를 등록시켜두지 않았기 때문에 해당 부분은 제외하고
CMake 명령어 자체에서 링크 작업을 수행한다.
경로 설정
현재 출력 파일의 경로는 RKEngine/Project/Script/build/Debug 이다.
다른 프로젝트에서 사용하려면 RKEngine/External/Dll/Debug/Script로 가야한다.
하지만 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
참고3: https://modoocode.com/332
참고4: https://www.tuwlab.com/ece/27260
2. MemoryLeak
ScriptReLoad가 가지고 있는 mScriptMap을 innserClear() 설정을 안해줘서 내부에서 삭제 작업이 일어나지 않아서 발생.
3.System CMake
visual studio 는 cmake를 인지하지 못한다.
이렇게 하면 system(cmake) 를 수행해도 cmake 명령어를 잘 인지한다.
안하면 cmake 명령어 자체가 뭔지 몰라서 잘못된 입력값이라고 뜸.
https://stackoverflow.com/questions/58773901/configure-cmake-version-in-visual-studio-2019
https://studium-anywhere.tistory.com/47
Debug중에 lib,dll 파일을 교체하려고 하면 문제가 발생한다.
이 문제는 FreeLibrary로 거의 해결했다. 덮어쓰기 하기전에 Free 하면 되는 것.
그러나 문제는 .pdb가 해제가 되지 않아서 액세스 오류가 뜨며 덮어쓰기를 못하는것..
.pdb는 program debug database라고 하는데 디버그 를 끝내야만 해제되는 듯 하다.
사실 디버깅하지 않고 그냥 ctrl + f5 누르면 충돌없이 잘 실행된다.
흠 reload 작업은 runtime에 필요한거지 디버깅중에 필요한건 아니긴 하다.
지금은 내가 엔진을 개발하고 있기 때문에 디버깅이 필요한거지만
엔진을 사용하는 사용자라고 생각했을땐 내가 엔진을 디버깅하진 않을것이고
엔진 사용중에 Script만 고쳤다가 다시 엔진으로 돌아갔을때 reload가 발생하는걸 원하는 것이니 문제가 없을 것 같다.
또 내가 엔진을 구현중에 있을때도 디버그 돌리는 상태에서 코드를 수정하진 않을테니 reload를 하지 않을것이다.
이 부분은 좀 더 생각해보고 다른거 구현중에 문제가 생긴다면 그때 다시 생각해보도록 한다.
'포트폴리오 만들기' 카테고리의 다른 글
16.DX Code 짜기/IManager 분리/Flip Model/삼각형 띄우기/FileManager/AddTCHAR (0) | 2024.01.21 |
---|---|
15.DxRenderer Dll (0) | 2024.01.19 |
13.ConsoleTestCode/Map변경점/CRKEngine변경점/CScriptReLoad Class 생성/FileManager 변경점 (0) | 2024.01.17 |
12. ScriptManager 자동화 (0) | 2023.12.28 |
11. ScriptReader/FileManager/ (0) | 2023.12.27 |
댓글