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

これは、 [C++ Advent Calendar 2019](https://qiita.com/advent-calendar/2019/cpp) の10日目の記事です。
昨日は @mdstoy さんによる [next_combinationを実装してみた](https://qiita.com/mdstoy/items/39104b686540c5f1dc6c) でした。


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

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

サンプルコードはこちらです。
[GitHub / segurvita / fbx_sdk_cpp_sample](https://github.com/segurvita/fbx_sdk_cpp_sample)




# フォルダー階層

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

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



# src/main.cppを作る

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

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

```c++: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 の違い](https://qiita.com/segur/items/8b385a44a08756a5fdb1)



# Dockerfileを作る

次に `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](http://help.autodesk.com/view/FBX/2019/ENU/?guid=FBX_Developer_Help_getting_started_installing_and_configuring_configuring_the_fbx_sdk_for_linux_html)

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



# docker-compose.ymlを作る

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

```yaml: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を作る

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

```bash: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イメージを作成します。

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

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



# Dockerで実行する

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

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

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

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

```bash
Success!
```

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

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



# さいごに

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

- [Configuring the FBX SDK for Linux](http://help.autodesk.com/view/FBX/2019/ENU/?guid=FBX_Developer_Help_getting_started_installing_and_configuring_configuring_the_fbx_sdk_for_linux_html)
- [freakthemighty/fbx2gltf](https://hub.docker.com/r/freakthemighty/fbx2gltf/dockerfile)
- [FBX SDK Linux Install (Centos 7)](https://blog.dashgl.com/?p=266)

これは、 [C++ Advent Calendar 2019](https://qiita.com/advent-calendar/2019/cpp) の10日目の記事でした。
明日は @tyu_ru_cpp さん による [min/maxみたいな関数の呼び出し]( https://qiita.com/tyu_ru_cpp/items/260c2f0e691f97eaa54e ) です！