ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [C++] CMake를 이용한 DLIB 컴파일 및 Visual Studio 2019 연동 (부제: USER_ERROR__inconsistent_build_configuration__see_dlib_faq_2 해결)
    SWMaestro(Archive) 2019. 8. 11. 01:17

    최근 진행하고 있는 프로젝트에서 DLIB를 사용할 일이 있었다. 처음엔 어찌어찌 컴파일을 해내어 .lib 파일을 만들어 사용했었다. 하지만 사용하다보니 CUDA가 활성화가 안되어 있는 것을 깨닫고 재설치를 위해 약 1주일간 삽질을 하다가 드디어 성공하여 포스트를 남긴다.

     

    삽질을 시작하게 된 에러 메세지는 바로 USER_ERROR__inconsistent_build_configuration__see_dlib_faq_2

    DLIB를 직접 컴파일 하지 않고 남이 만들어 놓은 (즉 다른 환경에 맞춰 컴파일 된) 라이브러리를 가져다 써서 생기는 문제라고 하는데 직접 컴파일을 해봐도 계속 저런 에러 메세지를 만나 매우 답답한 상황이었다.

     

     

     

    DLIB에 대한 설명은 영문 위키를 참고하자.

    https://en.wikipedia.org/wiki/Dlib

     

    Dlib - Wikipedia

    Dlib is a general purpose cross-platform software library written in the programming language C++. Its design is heavily influenced by ideas from design by contract and component-based software engineering. Thus it is, first and foremost, a set of independ

    en.wikipedia.org

    먼저 DLIB를 사용하기 위해서는 두 가지가 필요하다.

    DLIB: 최신 버전 사용(19.17) http://dlib.net/

    CMake: https://cmake.org/

     

    CMake의 경우에는 그냥 설치만 해주면 되고, DLIB는 적당한 위치에 압축을 풀어주자.

     

    설치가 모두 완료되었다면 CMake를 실행시켜보자.

    아마 위와 같은 화면을 볼 수 있을 것이다.

    DLIB를 컴파일 하기 위해 "Where is the source code"에 DLIB 압축을 푼 폴더가 있는 곳의 examples 경로를

    "Where to build the binaries"에는 결과물이 저장될 폴더를 설정해주면 된다.

     

    예를 들어 D드라이브의 dlib-19.17 폴더에 내용물이 있다면 아래의 그림과 같이 설정해주면 된다.

    물론 결과물이 나올 폴더는 적절한 다른 위치를 설정해줘도 상관없다.

     

    이후 좌측 하단에 있는 conficure 버튼을 눌러주면 다음과 같은 화면을 만난다.

    결과물이 저장 될 폴더가 없으면 이렇게 친절하게 만들어준다.

     

    이후 자신의 환경에 따라 설정을 해주면 된다. 

    이 포스팅에서는 Visual Studio 16 2019와 64비트용으로 진행한다.

    설정을 마치고 Finish 버튼을 누르면 CMake가 알아서 여러가지 환경들을 검사한다.

    CUDA, CuDNN, OpenCV 등이 설치되어 있는지를 알아서 확인해준다. (물론 못잡는 경우도 있다.)

     

    여러가지 확인이 끝난 후 다음과 같은 결과를 내뱉는다.

    홈페이지를 확인해보니 속도 향상을 위해서는

    USE_AVX_INSTRUCTIONS

    USE_SSE2_INSTRUCTIONS

    USE_SS4_INSTRUCTIONS

    이 세가지 항목을 체크해주라고 하니 체크해준다.

    뿐만 아니라 OpenCV도 사용할 생각이니 설치된 폴더를 직접 지정해준다.

    폴더를 지정할 때에는 OpenCV가 설치된 곳의 build 폴더를 지정해주면 된다.

     

    이 포스팅을 시작하게된, 즉 삽질의 원인은 맨 처음 CMake를 이용해 DLIB를 컴파일 할 때 CUDA를 잡지 못했었던 것이다. 이유가 무엇인고하니 Visual Studio 2019과 이전에 설치되어 있던 CUDA가 호환이 안된다는 점이었다.

    따라서 CUDA, CuDNN을 최신 버전으로 설치해준 후 컴파일을 시도하니 CUDA를 잘 인식한다.

     

    원하는 설정을 모두 마쳤다면 다시 한번 Configure 버튼을 눌러주면 모든 빨간화면이 사라지고 하단에 Configuring done이라는 문구를 확인할 수 있다.

    이후 좌측 하단의 Generate 버튼을 눌러주면 Generating done이라는 문구를 확인할 수 있고 결과물을 저장하고자 지정했던 폴더로 가보면 결과물을 확인할 수 있다. 이렇게 generating이 끝났다면 CMake의 역할은 끝이다.

     

    결과물을 저장하겠다고 지정했던 폴더안에 dlib_build라는 폴더가 생성된 것을 확인할 수 있다.

    이 폴더에 들어가 dlib.sln을 실행해주자.

    이후 Debug x64를 Release x64로 변경해주고

    빌드 > 구성 관리자에 들어가면 다음과 같은 화면을 볼 수 있는데 모든 프로젝트의 빌드에 체크해주자.

    이후 솔루션을 빌드해주면 Release 폴더에 lib 파일이 결과물로 나온다.

    이를 위해 얼마나 많은 삽질을 했는가...

     

    자 이제 DLIB 컴파일이 끝났으니 이를 Visual Studio에서 사용할 수 있도록 연결시켜주자.

    먼저 적당한 프로젝트를 생성해준 후 소스 파일을 추가하고, Release x64로 변경해주자.

     

    이후 프로젝트 > 속성으로 들어간다. 이곳에서도 역시 구성과 플랫폼을 Release x64로 변경해주고 시작한다.

    가장 먼저 VC++ 디렉터리 메뉴포함 디렉터리라이브러리 디렉터리를 수정해줘야 한다.

     

    먼저 포함 디렉터리에는 OpenCV의 include 폴더와 DLIB 압축을 풀어준 폴더를 추가해준다.

     

    라이브러리 디렉터리에는 OpenCV의 lib 폴더와 DLIB의 lib 파일이 저장되어 있는 곳을 추가해준다.

     

    이후 링커 > 입력 > 추가 종속성OpenCV와 DLIB의 라이브러리를 추가해준다.

     

    자 이제 설정이 다 끝났으니 DLIB 홈페이지에 있는 간단한 예제를 실행해보자.

    http://dlib.net/ 에 가보면 다양한 예제들을 확인할 수 있다.

    #include<dlib/gui_widgets.h>
    #include<dlib/image_transforms.h>
    #include<cmath>
    
    using namespace dlib;
    using namespace std;
    
    int main() {
    	std::vector<perspective_window::overlay_dot> points;
    	dlib::rand rnd;
    	for (double i = 0; i < 20; i += 0.001) {
    		dlib::vector<double> val(sin(i), cos(i), i / 4);
    
    		dlib::vector<double> temp(rnd.get_random_gaussian(),
    			rnd.get_random_gaussian(),
    			rnd.get_random_gaussian());
    		val += temp / 20;
    
    		rgb_pixel color = colormap_jet(i, 0, 20);
    
    		points.push_back(perspective_window::overlay_dot(val, color));
    	}
    
    	perspective_window win;
    	win.set_title("perspective_window 3D point cloud");
    	win.add_overlay(points);
    	win.wait_until_closed();
    }

     

     

    잘 실행되었다!! 신난다~

     


    추가 (CuDNN 라이브러리)

     

    예제를 실행해보고 매우 신나있던 찰나 원래 진행하던 프로젝트로 돌아가 컴파일을 해보니 어마무시한 오류 개수를 확인했다.

    이 정도 나오면 그냥 아무것도 하기 싫어진다.

     

    어쩐지 느낌이 CuDNN 라이브러리가 추가되지 않은 듯한 느낌이다.

    프로젝트 > 속성으로 들어가서 라이브러리와 경로를 함께 추가해주자.

    VC++ 디럭터리의 라이브러리 디렉터리
    VC++ 디렉터리의 포함 디렉터리
    링커 > 입력의 추가 종속성

     

    에러가 40개정도 줄긴 했는데 여전히 안된다...


    결국 구글링을 통해 몇 가지 해법들을 찾아봤다.

    먼저 프로젝트의 빌드 종속성에 CUDA를 추가해준다. 프로젝트 이름을 우클릭 하여 들어갈 수 있다.

    위와 같이 CUDA에 체크해준다.

     

    이후 포함 디렉터리와 라이브러리 디렉터리에 다음과 같이 추가해준다.

    포함 디렉터리
    라이브러리 디렉터리

    이후 라이브러리를 추가해줘야 하는데 해당 폴더에 들어가보니 어마어마하게 많은 라이브러리들이 있다.

    총 6개의 라이브러리를 추가하고 나서야 모든 에러를 없앨 수 있었다.

    curand.lib
    cusolver.lib
    cuda.lib
    cublas.lib
    cudart.lib
    cufft.lib

     

    진짜 끝났다...

    'SWMaestro(Archive)' 카테고리의 다른 글

    구글 이미지 크롤링(Google images download)  (2) 2019.05.29

    댓글

Designed by Tistory.