정적 라이브러리 (static library) 빌드하기
- lib의 부재
매번 편하게 lib, dll만을 사용했는지, 일전에 아주 바보같은 일을 겪었다.
최근 필요에 의해 zlib 소스를 사용해야할 일이 생겼는데 난처한 상황이 생겼다.
라이브러리 폴더 등 PATH설정을 마치고 빌드를 실행하니 링커에서 에러가 발생했다.
에러코드 LNK2019가 발생하는 것을 보고 헤더파일의 선언은 인식했으나 정의는 제대로 로드되지 않은 것 같았다.
참 웃기게도 바보처럼 .c파일을 우째 로드해야하나… 생각을 하였다.
이럴 경우 두 가지 방법이 있다. 프로젝트 폴더로 소스파일(*.c, *.cpp)과 헤더파일(*.h)을 프로젝트 폴더로 전부 옮긴 뒤 기존 항목 추가로 직접적으로 프로젝트에 포함시키는 방법.
그리고 조금 더 graceful하게 lib으로 묶는 방법.
이 방법에 관해서 분명 프로젝트 템플릿에서 본적이 있을 것이다.
물론 모듈제작을 해보지 않았다면 지나쳤을 것이다.
이 이미지를 보면 기억이 날 것이다. “아 이거 본적있어!”
프로젝트 만들기를 눌러 DLL혹은 정적 라이브러리 항목을 선택해준다.
다만 링킹 개념이 정확하게 확립되지 않았다면 정적으로 묶을 것을 추천한다.
DLL은 쓰지도 않을 기능들이 lib에 한번에 묶여버리면 프로그램 덩치만 커지고 메모리도 많이 잡아먹으므로 이를 동적으로 로드하는 것으로 해결하기 위해 사용한다.
- lib 제작
제작 방법은 매우 간단하다.
src(source)의 압축을 해제하면 다양한 소스파일과 헤더파일이 보일 것이다.
그 안에 분명 lib이나 dll은 보이지 않는다. — 소스파일이므로
이 파일들을 일반 C, C++ 솔루션에 소스파일과 헤더파일넣듯 넣고 빌드하면된다.
혹시라도 어… 소스파일 어떻게 추가해요? 싶다면
소스 파일 디렉터리와 헤더 파일 디렉터리에서 우클릭하여 “기존 항목 추가“라는 메뉴를 선택한다. 그리고 파일을 불러온다.
위와 같이 나온다면 된 것이다.
이제 빌드하면 된다. 솔루션 구성을 필요에 맞게 Debug혹은 Release로 설정한 후 빌드를 한다.
이제 *.lib파일을 꺼내 필요한 프로젝트에 종속성 추가를 해준다.
- 트러블 슈팅
간혹 구버전 혹은 고대에 사용되던 소스의 경우 Deprecated나 unsafe문제가 발생할 수 있는데, Deprecated의 경우 에러 리스트를 확인하며 수동으로 갱신하거나 awk나 sed를 사용할 수 있다면 일괄적으로 수정해주는 방법도 있으나 식 작성에 매우 유의해야 한다.
unsafe문제는 프로젝트 속성 ->
C/C++ -> 전처리기 -> 전처리기 정의에 _CRT_SECURE_NO_WARNINGS를 추가해준다.
다만, Windows의 환경변수를 수정하듯 각 구분자(Delimeter)는 ‘;’. 세미콜론을 사용한다. 그러므로 앞선 정의 뒤에 ;를 붙인 뒤 NO WARNINGS를 추가해주고 마지막에 또 ;를 붙여준다.
ex) SOME_DEFINITIONS;_CRT_SECURE_NO_WARNINGS;
소스사용이 필요한 사람이라면 글을 참고하여 라이브러리로 빌드하여 사용하기 바람..
67개의 댓글