데굴데굴이
데굴이의 개발일지
데굴데굴이
전체 방문자
오늘
어제
  • 분류 전체보기
    • 프로그래밍
      • C,C++
      • C#
      • 백준(BOJ)
      • 알고리즘
      • HTML
      • WinAPI
      • ETC
    • 유니티
      • 쉐이더
    • 컴퓨터 구조
    • 일본어

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 1158번
  • 알고리즘
  • 시퀀스 포인트
  • 1032번#
  • 정적 라이브러리
  • 25644
  • 최대 상승
  • Sequence Point
  • 10811
  • 25644번
  • 평가 순서
  • C언어
  • 동적 라이브러리
  • 동적 라이브러리 만들기
  • c++
  • 컴파일
  • multable
  • 정적 라이브러리 만들기
  • 백준
  • 전처리
  • C
  • 바구니 뒤집기
  • 재귀함수가 뭔가요?
  • 1343번
  • 동적 라이브러리 적용
  • msvc++
  • 라이브러리 적용
  • BOJ
  • 10811번
  • 라이브러리

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
데굴데굴이

데굴이의 개발일지

프로그래밍/C,C++

C++ 동적 라이브러리 만들기

2023. 1. 3. 03:48
반응형

글을 읽기 전 동적 라이브러리에 대해 알기 위해선 라이브러리에 대해 알아야 합니다.

 

관련 글은 아래 링크를 참고해 주세요.

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
    '프로그래밍/C,C++' 카테고리의 다른 글
    • [C++]람다 표현식(Lambda Expression) 정리
    • C++ 정적 라이브러리 만들기
    • C 평가 순서 [unspecified, undefined, Sequence Point]
    • C++ 입력 버퍼 초기화 [ cin.ignore() ]
    데굴데굴이
    데굴데굴이

    티스토리툴바