質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.61%

UE4でgRPC実装途中でのabseil外部シンボル参照エラー

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,100

score 6

前提・実現したいこと

UE4からgrpcを使っての通信を実装しようとしています。
調べてみるとInfraworld(https://github.com/vizor-games/InfraworldRuntime)というプラグインがあり、ライブラリ作成のためにこちらのSetup.batを使ってみたのですが
いくつかの外部シンボル参照エラーが出てしまいました。

エラーの内容的にabslのlibファイルが作成されていないのが原因なのかと思って調べてみていますが
建設的な情報が見つからなかったためこちらに質問を書かせていただきました。

Setup.batのBRANCHはサーバー側のバージョンに合わせて1.29.xに変更しています。
UE_ROOTは私の環境に合わせて設定されています。

発生している問題・エラーメッセージ

1>grpc.lib(client_channel.obj) : error LNK2019: 未解決の外部シンボル "void __cdecl absl::lts_2020_02_25::optional_internal::throw_bad_optional_access(void)" (?throw_bad_optional_access@optional_internal@lts_2020_02_25@absl@@YAXXZ) が関数 "private: void __cdecl grpc_core::`anonymous namespace'::CallData::ApplyServiceConfigToCallLocked(struct grpc_call_element *)" (?ApplyServiceConfigToCallLocked@CallData@?A0xe6a7ad75@grpc_core@@AEAAXPEAUgrpc_call_element@@@Z) で参照されました。
1>grpc.lib(cds.obj) : error LNK2001: 外部シンボル ""void __cdecl absl::lts_2020_02_25::optional_internal::throw_bad_optional_access(void)" (?throw_bad_optional_access@optional_internal@lts_2020_02_25@absl@@YAXXZ)" は未解決です。
1>grpc.lib(xds.obj) : error LNK2001: 外部シンボル ""void __cdecl absl::lts_2020_02_25::optional_internal::throw_bad_optional_access(void)" (?throw_bad_optional_access@optional_internal@lts_2020_02_25@absl@@YAXXZ)" は未解決です。
1>grpc.lib(xds_client.obj) : error LNK2001: 外部シンボル ""void __cdecl absl::lts_2020_02_25::optional_internal::throw_bad_optional_access(void)" (?throw_bad_optional_access@optional_internal@lts_2020_02_25@absl@@YAXXZ)" は未解決です。
1>grpc.lib(chttp2_transport.obj) : error LNK2019: 未解決の外部シンボル "private: static bool __cdecl absl::lts_2020_02_25::str_format_internal::FormatArgImpl::Dispatch<char const *>(union absl::lts_2020_02_25::str_format_internal::FormatArgImpl::Data,class absl::lts_2020_02_25::str_format_internal::FormatConversionSpec,void *)" (??$Dispatch@PEBD@FormatArgImpl@str_format_internal@lts_2020_02_25@absl@@CA_NTData@0123@VFormatConversionSpec@123@PEAX@Z) が関数 "class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __cdecl absl::lts_2020_02_25::StrFormat<char const *,char *>(class absl::lts_2020_02_25::str_format_internal::FormatSpecTemplate<char const *,char *> const &,char const * const &,char * const &)" (??$StrFormat@PEBDPEAD@lts_2020_02_25@absl@@YA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AEBV?$FormatSpecTemplate@PEBDPEAD@str_format_internal@01@AEBQEBDAEBQEAD@Z) で参照されました。
1>grpc.lib(chttp2_transport.obj) : error LNK2019: 未解決の外部シンボル "class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __cdecl absl::lts_2020_02_25::str_format_internal::FormatPack(class absl::lts_2020_02_25::str_format_internal::UntypedFormatSpecImpl,class absl::lts_2020_02_25::Span<class absl::lts_2020_02_25::str_format_internal::FormatArgImpl const >)" (?FormatPack@str_format_internal@lts_2020_02_25@absl@@YA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@VUntypedFormatSpecImpl@123@V?$Span@$$CBVFormatArgImpl@str_format_internal@lts_2020_02_25@absl@@@23@@Z) が関数 "class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __cdecl absl::lts_2020_02_25::StrFormat<char const *,char *>(class absl::lts_2020_02_25::str_format_internal::FormatSpecTemplate<char const *,char *> const &,char const * const &,char * const &)" (??$StrFormat@PEBDPEAD@lts_2020_02_25@absl@@YA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AEBV?$FormatSpecTemplate@PEBDPEAD@str_format_internal@01@AEBQEBDAEBQEAD@Z) で参照されました。
1>grpc.lib(xds.obj) : error LNK2019: 未解決の外部シンボル "void __cdecl absl::lts_2020_02_25::base_internal::ThrowStdOutOfRange(char const *)" (?ThrowStdOutOfRange@base_internal@lts_2020_02_25@absl@@YAXPEBD@Z) が関数 "public: void __cdecl grpc_core::`anonymous namespace'::XdsLb::LocalityMap::UpdateXdsPickerLocked(void)" (?UpdateXdsPickerLocked@LocalityMap@XdsLb@?A0x5b6dae6d@grpc_core@@QEAAXXZ) で参照されました。
1>grpc.lib(service_config.obj) : error LNK2001: 外部シンボル ""void __cdecl absl::lts_2020_02_25::base_internal::ThrowStdOutOfRange(char const *)" (?ThrowStdOutOfRange@base_internal@lts_2020_02_25@absl@@YAXPEBD@Z)" は未解決です。
1>grpc.lib(ssl_transport_security.obj) : error LNK2001: 外部シンボル ""void __cdecl absl::lts_2020_02_25::base_internal::ThrowStdOutOfRange(char const *)" (?ThrowStdOutOfRange@base_internal@lts_2020_02_25@absl@@YAXPEBD@Z)" は未解決です。
1>gpr.lib(host_port.obj) : error LNK2001: 外部シンボル ""void __cdecl absl::lts_2020_02_25::base_internal::ThrowStdOutOfRange(char const *)" (?ThrowStdOutOfRange@base_internal@lts_2020_02_25@absl@@YAXPEBD@Z)" は未解決です。
1>grpc.lib(ssl_utils.obj) : error LNK2019: 未解決の外部シンボル "public: unsigned __int64 __cdecl absl::lts_2020_02_25::string_view::find(char,unsigned __int64)const " (?find@string_view@lts_2020_02_25@absl@@QEBA_KD_K@Z) が関数 "bool __cdecl grpc_ssl_check_call_host(class absl::lts_2020_02_25::string_view,class absl::lts_2020_02_25::string_view,class absl::lts_2020_02_25::string_view,struct grpc_auth_context *,struct grpc_error * *)" (?grpc_ssl_check_call_host@@YA_NVstring_view@lts_2020_02_25@absl@@00PEAUgrpc_auth_context@@PEAPEAUgrpc_error@@@Z) で参照されました。

試したこと

https://qiita.com/YujiroTakahashi/items/de5dbd67e2f77ee465c8
こちらを参考にabseil-cppを手動でビルドしてみようとしたところ以下のように失敗しました

S:\PluginTest\Plugins\TestPlugin\grpc\third_party\abseil-cpp>mkdir build

S:\PluginTest\Plugins\TestPlugin\grpc\third_party\abseil-cpp>cd build

S:\PluginTest\Plugins\TestPlugin\grpc\third_party\abseil-cpp\build>cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_POSITION_INDEPENDENT_CODE=TRUE ..
-- Building for: Visual Studio 15 2017
-- Selecting Windows SDK version 10.0.17763.0 to target Windows 10.0.18363.
-- The CXX compiler identification is MSVC 19.16.27040.0
-- Check for working CXX compiler: C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/VC/Tools/MSVC/14.16.27023/bin/Hostx86/x86/cl.exe
-- Check for working CXX compiler: C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/VC/Tools/MSVC/14.16.27023/bin/Hostx86/x86/cl.exe -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- No CMAKE_CXX_STANDARD set, assuming 11
-- Looking for C++ include pthread.h
-- Looking for C++ include pthread.h - not found
-- Found Threads: TRUE
-- Configuring done
-- Generating done
CMake Warning:
  Manually-specified variables were not used by the project:

    CMAKE_BUILD_TYPE


-- Build files have been written to: S:/PluginTest/Plugins/TestPlugin/grpc/third_party/abseil-cpp/build

S:\PluginTest\Plugins\TestPlugin\grpc\third_party\abseil-cpp\build>make -j
make: *** ターゲットが指定されておらず, makefile も見つかりません.  中止.

補足情報(FW/ツールのバージョンなど)

Windows10_64bit
UnrealEngine4.24
cmake version 3.16.3
VisualStudio2017_Community

足りない情報などありましたらご指摘いただければ幸いです

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Penpen7

    2020/06/15 13:47 編集

    一度Debugフォルダを削除してもう一度ビルドしてみてください
    http://jamfolder.work/archives/34830440.html
    プロジェクト名等は書き換えなくていいと思います

    キャンセル

  • s_nmt

    2020/06/15 19:10

    abseil-cpp\build\x64\Debug フォルダを削除したあと
    absl.sln をもう一度ビルドしてみましたが、同様のエラーが出てしまいました。

    一度 abseil-cpp\build を削除してもう一度 build フォルダを作成したあとcmakeのコマンドを以下のように修正したら64bitでのビルドに成功しました。
    ```
    cmake -G "Visual Studio 15 2017 Win64" -DCMAKE_BUILD_TYPE=Release -DCMAKE_POSITION_INDEPENDENT_CODE=TRUE -DABSL_RUN_TESTS=ON -DABSL_USE_GOOGLETEST_HEAD=ON -DCMAKE_CXX_STANDARD=11 ..
    ```
    abslのビルドが成功した後、abseil-cpp\build\absl 以下にあるlibファイルをすべて GrpcLibraries に移したところ
    無事にビルドが通り、UEエディタを起動することもできました。

    解決方法についてまた別途記載しようと思います。
    諸々ご助言いただき誠にありがとうございました。

    キャンセル

  • Penpen7

    2020/06/15 21:09

    無事解決できたとのことで、よかったです!

    キャンセル

回答 1

check解決した方法

+1

1.Setup.batのcmakeコマンドに -DgRPC_BUILD_TESTS=OFF を追加
(あんまり意味はなさそうだけど、やったことなので一応記載)

//->before
call cmake .. -G "Visual Studio 15 2017 Win64" -..(省略)..-DSSL_EAY_RELEASE="%UE_ROOT%\Engine\Source\ThirdParty\OpenSSL\1.1.1\Lib\Win64\VS2015\Release\libssl.lib"

//->after
call cmake .. -G "Visual Studio 15 2017 Win64" -..(省略)..-DSSL_EAY_RELEASE="%UE_ROOT%\Engine\Source\ThirdParty\OpenSSL\1.1.1\Lib\Win64\VS2015\Release\libssl.lib" -DgRPC_BUILD_TESTS=OFF

2.Setup.batを実行、完了まで待つ

3.コマンドプロンプトを開き、grpc/third_party/abseil-cpp に移動

4.以下のコマンドを実行

mkdir build && cd build
cmake -G "Visual Studio 15 2017 Win64" -DCMAKE_BUILD_TYPE=Release -DCMAKE_POSITION_INDEPENDENT_CODE=TRUE -DABSL_RUN_TESTS=ON -DABSL_USE_GOOGLETEST_HEAD=ON -DCMAKE_CXX_STANDARD=11 ..


5.cmakeコマンドで作成された absl.sln を VisualStudio で開く

6.ソリューション構成を Release に変更し、ビルドターゲットがALL_BUILDになっていることを確認してからビルド開始。

7.ビルドが終わったあと grpc\third_party\abseil-cpp\build\absl 以下に対して *.lib で検索をかけて見つけた .lib ファイルをすべて GrpcLibraries にコピー

8.UE4側のプロジェクトでビルドが通るか確認。

ビルドが通ることしか確認していないので、実際に使えるかどうかはまだ試せていません。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る