https://github.com/thejinchao/libprotobuf
GitHub - thejinchao/libprotobuf: libprotobuf for Unreal Engine 4
libprotobuf for Unreal Engine 4. Contribute to thejinchao/libprotobuf development by creating an account on GitHub.
github.com
Git Submodule - Git 프로젝트에서 다른 Git 프로젝트를 하위 디렉토리에 포함시키는 방법
// 서브 모듈을 사용하는 프로젝트를 처음 받을때
git clone -b v23.0 --recursive https://github.com/protocolbuffers/protobuf.git
// 위의 명령어로 클론하면 아래 명령어 칠 필요 없음
*참고용*
// 중간에 서브모듈이 추가되었을 때
git submodule update --init --recursive
// 서브모듈 업데이트
git submodule update --remote
protobuf-source 폴더는 다른 Git 레퍼지토리랑 '링크' 되어있는 상태
CMake
https://gist.github.com/dongbum/d1d49e38a20f9cf52ea39f9ce2702160
CMake란 여러 환경(window , linux 등)에 맞는 build process를 작성한 것으로, CMakeLists.txt에 기술된 내용을 바탕으로 각 확경에 맞는 Makefile을 생성해 주는 프로그램이다.
전체 빌드 프로세스를 관리해주는 유용한 툴이다. 직접 빌드를 수행하지는 않지만 지정된 OS에 맞는 Make파일 혹은 **솔루션(sln)**파일의 생성을 도와주어 소스코드 빌드를 편리하게 해준다.
반드시 빌드 파일 용 디렉토리를 만든 다음에 해당 디렉토리에서 CMake 를 실행합시다. CMake 는 실행시 여러가지 파일들 (캐시 용도로) 을 생성하는데 이 때문에 프로젝트 디렉토리가 난장판이 될 수 있습니다. 특히 이미 있는 파일을 덮어 씌우기야 한다면 더욱 끔찍..
ToolChain
CMake가 지원하는 다양한 기능들을 사용해 빌드를 수행할 수 있도록 미리 지정된 파일을 의미
대표적으로 Android NDK에서는 여러 아키텍처로의 크로스 컴파일에 필요한 설정들이 작성된 android.toolchain.cmake 파일이 함께 제공되며, CMake를 사용한 빌드를 수행시에 Gradle에 의해서 자동으로 지정됩니다.
iphone을 대상으로 하는 경우에는 https://github.com/leetal/ios-cmake 를 사용해 XCode 프로젝트를 생성하기도 합니다.
→ 크로스 플랫폼 컴파일을 위해 필요 (Android 용 / IOS 용 등)
언리얼 엔진 용 Google Protobuf 빌드 (v23.0 기준)
상단의 thejinchao 깃 허브에서 IOS 빌드할 때 CXX_STANDARD로 17을 사용하였는데 언리얼 빌드 때 오류가 나서 14 사용함
CMAKE_INSTALL_PREFIX 실행 바이너리와 라이브러리 등의 최종 생성물을 복사할 설치 디렉토리
CMAKE_INSTALL_LIBDIR 실제로 언리얼에 사용될 .a 파일
-------------------------------- GIT -------------------------------
git clone -b v23.0 --recursive https://github.com/protocolbuffers/protobuf.git
-------------------------------- GIT -------------------------------
$PB_LIBRARY_PATH = /Users/<사용자>/Desktop/protobuf - 깃 허브 클론 위치
$BUILD_LIBRARY_PATH = /Users/<사용자>/Desktop/pbLib - 빌드된 라이브러리 (결과물)
-------------------------------- IOS -------------------------------
mkdir -p $PB_LIBRARY_PATH/build/_ios && cd $PB_LIBRARY_PATH/build/_ios
cmake -G "Unix Makefiles" \
-DCMAKE_INSTALL_PREFIX=$BUILD_LIBRARY_PATH \
-DCMAKE_TOOLCHAIN_FILE=/Users/<사용자>/Downloads/ios.toolchain.cmake \
-DCMAKE_INSTALL_LIBDIR=lib/ios \
-DPLATFORM=OS64 \
-DCMAKE_INSTALL_CMAKEDIR=lib/ios/cmake \
-DCMAKE_CXX_STANDARD=14 \
-Dprotobuf_BUILD_TESTS=false \
-Dprotobuf_WITH_ZLIB=false \
-Dprotobuf_BUILD_EXAMPLES=false \
-Dprotobuf_BUILD_PROTOC_BINARIES=false \
-Dprotobuf_BUILD_LIBPROTOC=false \
$PB_LIBRARY_PATH
cmake --build . --target install --config Release
-------------------------------- IOS -------------------------------
-------------------------------- Mac -------------------------------
mkdir -p $PB_LIBRARY_PATH/build/_mac && cd $PB_LIBRARY_PATH/build/_mac
cmake -G "Unix Makefiles" \
-DCMAKE_INSTALL_PREFIX=$BUILD_LIBRARY_PATH \
-DCMAKE_INSTALL_LIBDIR=lib/mac \
-DCMAKE_OSX_DEPLOYMENT_TARGET=10.14 \
-DCMAKE_INSTALL_CMAKEDIR=lib/mac/cmake \
-DCMAKE_CXX_STANDARD=14 \
-Dprotobuf_BUILD_TESTS=false \
-Dprotobuf_WITH_ZLIB=false \
-Dprotobuf_BUILD_EXAMPLES=false \
-Dprotobuf_BUILD_PROTOC_BINARIES=false \
-Dprotobuf_BUILD_LIBPROTOC=false \
$PB_LIBRARY_PATH
cmake --build . --target install --config Release
-------------------------------- Mac -------------------------------
두 번째 명령어에서 마지막에 붙는 $PB_LIBRARY_PATH 는 CMake 폴더 경로 인데 Protobuf 버전에 따라서 조금 달랐다.
CMake는 캐시파일을 생성하니 다시 빌드할 땐 $PB_LIBRARY_PATH/build/
폴더를 날리고 해야 한다.
프로젝트의 서드파티에 적용시켰는데 서드파티 폴더에 $BUILD_LIBRARY_PATH
의 Include 와 lib 폴더를 복사해 온다.
Protobuf.Build.cs
public class Protobuf : ModuleRules
{
public string GetUProjectPath()
{
return Path.Combine(ModuleDirectory, "../../..");
}
public Protobuf(ReadOnlyTargetRules Target): base(Target)
{
Type = ModuleType.External;
PublicSystemIncludePaths.Add(Path.Combine(ModuleDirectory, "include"));
PublicIncludePaths.Add(Path.Combine(ModuleDirectory, "include"));
if (Target.Platform == UnrealTargetPlatform.Win64)
{
string libPath = Path.Combine(ModuleDirectory, "lib", "win64");
foreach(string lib in Directory.GetFiles(libPath))
{
if (lib.ToLower().EndsWith(".lib"))
{
PublicAdditionalLibraries.Add(lib);
}
}
}
else if (Target.Platform == UnrealTargetPlatform.Android)
{
string libPath = Path.Combine(ModuleDirectory, "lib", "android", "arm64-v8a");
foreach (string lib in Directory.GetFiles(libPath))
{
if (lib.ToLower().EndsWith(".a"))
{
PublicAdditionalLibraries.Add(lib);
}
}
}
else if (Target.Platform == UnrealTargetPlatform.Mac)
{
string libPath = Path.Combine(ModuleDirectory, "lib", "mac");
foreach(string lib in Directory.GetFiles(libPath))
{
if (lib.ToLower().EndsWith(".a"))
{
PublicAdditionalLibraries.Add(lib);
}
}
}
else if (Target.Platform == UnrealTargetPlatform.IOS)
{
string libPath = Path.Combine(ModuleDirectory, "lib", "ios");
foreach(string lib in Directory.GetFiles(libPath))
{
if (lib.ToLower().EndsWith(".a"))
{
PublicAdditionalLibraries.Add(lib);
}
}
}
PublicDefinitions.AddRange(
new string[]
{
"GOOGLE_PROTOBUF_NO_RTTI=1",
"GOOGLE_PROTOBUF_USE_UNALIGNED=0"
});
}
}
먼저 Unreal에게 헤더 포함을 위해 폴더를 검색해야 한다고 알려준다 include
Include가 없으면 다양한 protobuf 헤더 파일을 사용할 수 없으며 직접 사용하지는 않지만 생성하는 모든 protobuf 파일에는 여전히 해당 파일이 필요
protobuf가 준수할 두 개의 플래그
GOOGLE_PROTOBUF_NO_RTTI=1 // 리플렉션을 사용하므로 런타임 유형 정보를 비활성화
GOOGLE_PROTOBUF_USE_UNALIGNED=0 // 플래그가 없으면 몇 가지 링커 오류가 있었고 몇 사람이 이를 비활성화하기 위해 언급한 것을 발견했으며 비활성화하면 문제가 해결되었다고 한다.
'언리얼 > Mac | iOS' 카테고리의 다른 글
Mac 엔진 5.2 -> 5.3 마이그레이션 발생 문제 (2) | 2024.01.23 |
---|---|
TestFlight (1) | 2024.01.09 |
언리얼 관련 Mac / IOS 삽질 (2) | 2023.06.14 |
ssh key / Mac OS 에 ssh 접근 (0) | 2023.05.31 |
Apple Developer (0) | 2023.05.28 |