C++版FBX SDK入りのDockerイメージを作ってみる


これは、 C++ Advent Calendar 2019 の10日目の記事です。
昨日は @mdstoy さんによる next_combinationを実装してみた でした。

FBX SDK入りのDockerイメージを作ってみる

Linux版のFBX SDKを使うことになったので、Dockerでの環境構築手順をまとめました。

サンプルコードはこちらです。
GitHub / segurvita / fbx_sdk_cpp_sample

フォルダー階層

最終的なフォルダー階層はこんな感じになります。

作業ディレクトリ/
  ├ docker-compose.yml
  ├ Dockerfile
  └ src/
    ├ build.sh
    └ main.cpp

src/main.cppを作る

まずは、 main.cpp を作ります。

とりあえず、以下のように、FBXマネージャーを生成してすぐに破棄するだけのコードにします。

main.cpp
#include <stdio.h>
#include <fbxsdk.h>

int main()
{
    // FBXマネージャーを生成する
    FbxManager *lSdkManager = FbxManager::Create();

    // FBXマネージャーを破棄する
    lSdkManager->Destroy();

    // エラーが起きなれば成功表示
    printf("Success!");
}

lSdkManager の先頭の l は、ローカル変数という意味です。FBXSDKのサンプルコードの命名規則なので、したがっておきます。

このあたりの命名規則は以下の記事にまとめましたので、興味がある方はご覧ください。

FBX SDK の pScene と lScene の違い

Dockerfileを作る

次に Dockerfile を作りましょう。こんな感じです。

Dockerfile
# gccのDockerイメージを元にする
FROM gcc:9.2

# 作業ディレクトリを作成
WORKDIR /fbx-sdk/

# tar.gzファイルをダウンロードする
RUN curl -L \
    https://www.autodesk.com/content/dam/autodesk/www/adn/fbx/20195/fbx20195_fbxsdk_linux.tar.gz \
    -o /tmp/fbx20195_fbxsdk_linux.tar.gz

# インストール先フォルダを作成する
RUN mkdir -p /fbx-sdk/install

# tar.gzファイルを解凍する
RUN tar -zxvf /tmp/fbx20195_fbxsdk_linux.tar.gz -C /fbx-sdk

# インストールする
RUN echo "yes\nn" | /fbx-sdk/fbx20195_fbxsdk_linux /fbx-sdk/install

# tar.gzファイルを削除する
RUN rm /tmp/fbx20195_fbxsdk_linux.tar.gz

FBX SDK公式ドキュメントによると、Linux版のコンパイラはgcc 4が推奨のようなので、Dockerイメージもgcc:4.9.4 にしました。

Configuring the FBX SDK for Linux

gcc:9.2 でも動作することを確認いたしました! @yumetodo さんご指摘ありがとうございました!

docker-compose.ymlを作る

次に、 docker-compose.yml を作成します。

docker-compose.yml
version: '3'
services:
  fbx-sdk-cpp:
    build:
      context: ./
      dockerfile: ./Dockerfile
    volumes:
      - ./src:/src
    working_dir: /src
    command: /src/build.sh

起動コマンドに /src/build.sh を指定しておきます。

src/build.shを作る

今度は、ビルド&実行用のスクリプトを作成します。

build.sh
# main.cppをビルドする
g++ -std=c++11 \
    -o /src/main \
    -I/fbx-sdk/install/include \
    /src/main.cpp \
    /fbx-sdk/install/lib/gcc/x64/release/libfbxsdk.a \
    -ldl -lltdl -llzma -lpthread -lxml2 -lz

# 実行する
/src/main

gccのオプションでつまづきました。

どうやらC++11を指定しなければいけないようです。

また、必要なライブラリを1つ1つ丁寧に指定する必要もありました。

Dockerイメージを作成する

以下のコマンドでDockerイメージを作成します。

# Dockerイメージを作成する
docker-compose build

仮想のLinuxマシンにFBX SDKがインストールされる様子が表示されます。数分待ちましょう。

Dockerで実行する

いよいよ実行しましょう。

以下のコマンドを叩くと、Dockerコンテナーが生成され、そのコンテナー内で build.sh が実行されます。

# Dockerコンテナを作成し、build.shを実行する
docker-compose up

実行すると、以下のように表示されます!

Success!

無事にFBX SDKを読み込むことができました!

(warning等が表示されますが、とりあえずは無視します)

さいごに

本記事作成にあたり、以下の記事を参考にさせていただきました。ありがとうございました。

これは、 C++ Advent Calendar 2019 の10日目の記事でした。
明日は @tyu_ru_cpp さん による min/maxみたいな関数の呼び出し です!