Coding Memo

Protobuf 프로젝트에 추가하기 (Windows, vcpkg) 본문

Language/C++

Protobuf 프로젝트에 추가하기 (Windows, vcpkg)

minttea25 2023. 10. 11. 23:58

 C#에서 Protobuf를 사용할 때는 간단하게 nuget 패키지에 있는 Google.Protobuf만 설치하면 되지만, C++은 직접 헤더 및 라이브러리들을 추가해주어야 한다.

 

만약 선택한 protobuf 프로젝트의 cmake 폴더 내에 CMakeLists.txt 파일이 있다면 아래 방법을 이용하는 방법도 있다. (보통 구버전에 해당한다.)

https://minttea25.tistory.com/127

 

Protobuf 프로젝트에 추가하기 (Windows, CMake)

C#에서 Protobuf를 사용할 때는 간단하게 nuget 패키지에 있는 Google.Protobuf만 설치하면 되지만, C++은 직접 헤더 및 라이브러리들을 추가해주어야 한다. (C#이 굉장히 편했던 것이었다!!!!!!!!!!!!!!!!!!!)

minttea25.tistory.com

 

그러나 최근 버전에는 위 방법으로는 cmake 생성이 잘 안되거나 특정 버전 이후로는 프로젝트 생성을 전 언어 통일했기 때문에 (CMakeLists.txt가 가장 바깥 디렉터리에 있다.) c++만 해당하는 솔루션을 생성하기가 어려워 졌다. 따라서 vcpkg를 이용해 빌드된 버전을 가져오는 방법을 찾았다.

https://github.com/protocolbuffers/protobuf/issues/12016

 

cmake no longer builds on version 22.0 · Issue #12016 · protocolbuffers/protobuf

What version of protobuf and what language are you using? Version: main/v3.6.0/v3.5.0 etc. (NOTE: please try updating to the latest version of protoc/runtime possible beforehand to attempt to resol...

github.com

 

 

준비물

 

- vcpkg

(https://github.com/microsoft/vcpkg)

 


1. vcpkg 깃허브 주소에 들어가서 Release에 배포된 최신버전 소스를 다운 받아주고 압축을 해제해준다.

(git으로 clone해도 무방하다.)

 

2. 프로젝트 디렉터리 내의 bootstrap-vcpkg.bat 배치파일을 실행시킨다. 이후 vcpkg.exe라는 바이너리 파일이 생성될 것이다.

 

 

3. cmd를 열고 해당 위치로 이동하고 다음 명령어를 실행하여 protobuf가 설치 가능여부와 버전을 확인한다.

(시스템 환경변수에 추가하면 이동할 필요는 없을 것이다. 필자는 편하게 해당 위치에서 직접 실행했다.)

vcpkg search protobuf

잠시 기다려면 아래와 같이 나타날 것이다.

 

4. 다음 명령어를 실행하여 protobuf를 설치한다.

만약 64비트 라이브러리를 원한다면 `::x64-windows`를 붙여서 실행한다.

vcpkg install protobuf:x64-windows

 

 

 

5. 설치가 완료되면 해당 위치에 `installed` 디렉터리를 확인한다.

 

installed > x64-windows 에 protobuf 바이너리 파일, 헤더 파일, 동적/정적 라이브러리 들이 있는 디렉터리가 생성되어 있는 것을 확인할 수 있다.

6. tools 디렉터리에서 libprotobuf.dll, libprotoc.dll 라이브러리와 함께 protoc.exe를 실행시킬 수 있다.

proto파일을 언어에 맞게 코드를 생성하는 파일이다.

 

7. 라이브러리 파일들을 가져온다.

lib 디렉터리에서 `libprotobuf.lib`

debuf > lib 디렉터리에서 'libprotobufd.lib`

 

두 파일을 사용하려는 프로젝트 내에 복사한다.

 

※ 버전에 따라 다른거 같지만 이 정적라이브러리로만은 실행이 안될 경우가 있다. (빌드는 성공적이나 실행중에 문제가 발생하는 경우다.)

위와 같이 libprotobuf.dll (Release), libprotobufd.dll(Debug) 라는 동적 라이브러리도 필요할 수도 있다.

위 두 파일의 위치는 다음과 같다. 아래 두 파일도 프로젝트 내에 복사해두자.

bin 디렉터리에 `libprotobuf.dll`

debug > lib 디렉터리에 `libprotobufd.dll`

 

 

8. include 디렉터리에 있는 google 디렉터리를 프로젝트에 복사한다.

 

 

9. 프로젝트에서 위에서 가져온 라이브러리와 include를 참조하도록 한다.

아래 내용을 프로젝트 속성의 `VC++ 디렉터리`에서 진행한다.

 

  • 헤더파일 참조: 포함 디렉터리(Include Directories) 항목에서 google 디렉터리를 복사한 경로를 추가한다.

ex) 만약 솔루션 디렉터리의 `Include` 디렉터리 내에 google 디렉터리가 있다면, 

$(SolutionDir)Include\

를 추가하면 된다. 주의 해야 할점은 생성된 pb.h, pb.cc 파일을 보면 헤더파일 참조가 google부터 시작한다는 점으로, google 디렉터리는 포함되면 안된다.

 

  • 정적 라이브러리(.lib) 참조: Debug와 Release가 따로 있으므로 일단 이 두 디렉터리를 포함하는 공통 경로를 추가한다.

ex) 만약 솔루션 디렉터리의 'Libraries' 디렉터리 내에 (아까 빌드한 라이브러리가 있는) Debug와 Release 디렉터리가 있다면,

$(SolutionDir)Libraries\

까지만 추가한다.

이후 Debug 및 Release는 코드에서 컨트롤 하도록 한다.

lib는 아까 지정한 라이브러리 경로이고 이후 오는 string 값은 직접 지정 상대경로이다.

#ifdef _DEBUG
#pragma comment(lib, "Debug\\libprotobufd.lib")
#else
#pragma comment(lib, "Release\\libprotobuf.lib")
#endif

Note: 모든 파일에 추가 할 수는 없으니 미리 컴파일 된 헤더 등에 추가하면 편할 것이다.

 

  • 동적 라이브러리(.dll) 참조: 프로젝트의 출력 디렉터리에 Debug와 Release에 알맞게 각각 libprotobufd.dll, libprotobuf.dll 파일을 위치시킨다. (exe파일 생성 위치에 위치시키면 된다.)

출력 경로는 default로 프로젝트 디렉터리에서 x64, x86와 같은 빌드 환경 디렉터리 내의 Debug, Release 디렉터리로 각각 설정되어 있을 것이다.


 

만약 include의 google 디렉터리내의 헤더 파일 버전이 pb.cc와 pb.h 파일을 생성하는데 사용했던 protobuf 버전과 일치 하지 않을 경우 LNK 에러가 나타날 수 있다.