글을 읽기 전 동적 라이브러리에 대해 알기 위해선 라이브러리에 대해 알아야 합니다.
관련 글은 아래 링크를 참고해 주세요.
https://gamedeveloper-programming.tistory.com/5
라이브러리 [ Library ]
글을 읽기 전 라이브러리에 대해 알기 위해선 컴파일, 링크에 대해 알아야 합니다. 관련 글은 아래 링크를 참고해 주세요. https://gamedeveloper-programming.tistory.com/3 빌드 과정 [Build Process] Bulid 란 ? 빌
gamedeveloper-programming.tistory.com
서론
만들기전에 앞서 본 포스트에서는 비주얼 스튜디오 2019로 라이브러리를 만듭니다.
저희는 코드를 만들때, 필요한 기능이 있는데 만들기 귀찮을때, 만들기 힘들때, 작업 속도를 더 빠르게 하기 위해 라이브러리를 씁니다. 그 중, DirectX 에서도 쓰는 범용성이 좋은 '동적' 라이브러리를 그동안 사용하기만 했지만 이번에는 직접 동적 라이브러리를 만들어 보겠습니다.
프로젝트 만들기
'새 프로젝트 만들기' 에서 아래로 내리다보면 DLL(동적 연결 라이브러리) 와 정적 라이브러리가 보이는데, 동적 라이브러리를 만들고 싶다면 DLL 프로젝트를 만들면되고, 정적 라이브러리를 만들고 싶다면 아래 정적 라이브러리를 만들면 됩니다.
( 뒤에 Andriod 가 붙어있는건 만들면안됨! 헷갈림 주의 )
동적 라이브러리
프로젝트를 만들면 어떤 이상한 *.cpp 파일과 *.h 파일들이 만들어졌는데, 이것은 프로젝트에서 그냥 기본으로 만들어준 것들이니 그냥 시원하게 다 지워버리자 그것이 만들때도 헷갈리지않고 깔끔하기 떄문!
이 포스트에는 간단한 동적 라이브러리를 만들기 때문에 이런 파일들은 넘겨도됨!
문제없음.
( 만약 활용하고 싶다면 검색해서 찾아보기 )
다 지워주면 이제 정적 라이브러리를 만들준비는 다 끝난 것이다.
이제 우리는 이 비어있는 라이브러리 안에 우리가 만들고 싶은 기능들을 입맛에 맞게 만들어 이 세상에서 하나뿐인 우리의 라이브러리를 만들것이다.
짠! 이렇게 *.cpp 파일과 *.h 파일을 만들어 라이브러리에 넣어주었다.
만약, 소스코드를 *.cpp 와 *.h 로 나누는 이유를 모른다면 아래 링크를 통해 파일분할에 대해 알고오는것이 좋다.
https://gamedeveloper-programming.tistory.com/4
파일 분할
글을 읽기전 파일 분할에 대해 알기 위해선 전처리기에 대해 알아야 합니다. 관련글은 아래 링크를 참고해주세요 . https://gamedeveloper-programming.tistory.com/3 빌드 과정 [Build Process] Bulid 란 ? 빌드(Build)
gamedeveloper-programming.tistory.com
코드를 보면 다른 부분은 우리가 알고있던 부분하고 똑같은데 void 앞에 익숙치 않은 문법이 있다.
__declspec(dllexport) 와 __declspec(dllimport) 가 있는데 이것들은 동적 라이브러리 에서 함수들에게 *.dll 로 쓰겠다는 뜻 입니다.
__ : 비주얼 스튜디오 에서 만든 문법
decl : 선언
spec : 명시
선언을 명시하겠다는 뜻 ( dllexport , dllimport )
그러기에 사용할 데이터, 함수, 클래스 또는 클래스 멤버 함수 앞에 선언 이라면 dllimport 를 정의 라면 dllexport 를 적어줘야 정상적으로 작동된다.
이제 빌드 한다면 우리의 예상대로라면 라이브러리 파일이 나올 것이다.
어라? 소스 코드에는 아무런 문제가 없는데, 컴파일 오류가 떠버렸다. 어디서 문제가 나온걸까?
그 이유는 처음에 라이브러리를 만들었을때를 기억하는가? 기본으로 만들어진 파일중 'pch.h' 이란 헤더파일이 있었는데
비주얼 스튜디오에서 자동으로 이 헤더 파일을 컴파일러에서 미리 컴파일되게 설정을 해놨는데 우리가 그 파일을 없애버렸기 때문에 오류가 나오는 것이다.
(미리 컴파일 하게하는 이유는 성능 향상을 위한것! 이렇게 설정을 안해도 정상적으로 작동한다.)
그럼, 이 설정을 바꾸려면 어떻게 해야할까 ?
컴파일 오류없이 정상적으로 빌드가 성공하는것을 볼수가 있다.
이제 만들어진 폴더 위치로 이동하면 (프로젝트 파일이 아닌 솔루션 파일의 디버그 파일로 들어가면 있다.)
이렇게 정상적으로 동적 라이브러리가 만들어졌다! ( 빌드 과정을 아는 사람이라면 *.lib 파일의 유형이 왜 오브젝트 파일인지 알수있다. )
이제 우리의 동적 라이브러리를 만들었다면. 사용을 해야한다.
우리는 *.idb, *.pdb 파일은 신경 쓸 필요없이 *.lib 파일, *.h 파일, *.dll 파일만 신경쓰면된다.
만들어진 *.lib 폴더와 *.h 파일은 복사하고 우리가 이제 라이브러리를 쓸 프로젝트 파일 안에 옮겨줘야한다.
( 동적 라이브러리를 배포할때도 이렇게 *.lib , *.h, *.dll 을 배포한다. )
동적 라이브러리 적용
이렇게 main 함수만 있는 main.cpp 파일을 하나 만들었다.
지금 이상태에서 라이브러리 헤더를 인클루드 하더라도 컴파일러는 제대로 인식을 못하고 오류를 뿜는다.
그럼 어떻게 적용해야하는 걸까?
위 라이브러리, 빌드 과정 글을 읽고 왔다면 우리는 필요한게 무엇인지 알수있다.
정의를 알고있는 '라이브러리 파일', 선언을 알고있는 '헤더파일' 그리고 이 파일들의 위치
우리는 이제 이것들을 하나씩 비주얼 스튜디오 컴파일러에게 알려주어 빌드시 알아서 가져오게 할것이다.
먼저, 헤더 파일의 위치가 어디 있는지 알려줄겁니다.
프로젝트 -> 속성 -> 구성 속성 -> C/C++ -> 일반 -> 추가 포함 디렉터리 로 이동
헤더 파일이 있는 폴더로 경로를 정합니다.
( 저는 따로 헤더파일을 관리하기 위해 'Include' 폴더를 만들고 거기 안에다가 파일을 넣었습니다. 그러니 헤더 파일이 Include 폴더 안에있으니 거기 폴더로 경로를 지정한 것. 만약 프로젝트 폴더 안에 헤더파일이 있다면 프로젝트 경로로 설정해주면 됨 )
정상적으로 폴더 경로가 설정이 완료됐다.
다음은 라이브러리의 경로를 설정해 줘야한다.
프로젝트 -> 속성 -> 구성 속성 -> 링커 -> 일반 -> 추가 라이브러리 디렉터리
위, 헤더파일 와 같은 방식으로 라이브러리 경로 폴더도 정해준다.
이렇게 해놓으면 이제 컴파일러는 헤더와 라이브러리가 있는 폴더를 알수있는 것.
이제 어떤 라이브러리를 가져올건지, 해당 라이브러리의 이름을 알려준다면 컴파일러는 정상적으로 라이브러리를 가져온다.
프로젝트 -> 속성 -> 구성 속성 -> 링커 -> 입력 -> 추가 종속성
사진과 같이 정상적으로 동적 라이브러리가 적용되어 우리가 만든 함수도 잘 잡히고 실행까지 되는걸 볼 수 있습니다.
'프로그래밍 > C,C++' 카테고리의 다른 글
[C++]람다 표현식(Lambda Expression) 정리 (0) | 2024.02.04 |
---|---|
C++ 정적 라이브러리 만들기 (0) | 2023.01.03 |
C 평가 순서 [unspecified, undefined, Sequence Point] (1) | 2022.12.30 |
C++ 입력 버퍼 초기화 [ cin.ignore() ] (0) | 2022.12.28 |