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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

UE4

UE4はUnreal Engine(アンリアルエンジン)の第4世代です。 UEは、Epic Gamesより開発されたゲームエンジンです。

Q&A

解決済

1回答

2829閲覧

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

s_nmt

総合スコア6

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

UE4

UE4はUnreal Engine(アンリアルエンジン)の第4世代です。 UEは、Epic Gamesより開発されたゲームエンジンです。

0グッド

1クリップ

投稿2020/06/11 10:51

編集2020/06/11 10:55

前提・実現したいこと

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Penpen7

2020/06/12 01:46

おそらくそのライブラリを入れれば解決できると思います。手動のビルドに失敗したとのことですが、S:\PluginTest\Plugins\TestPlugin\grpc\third_party\abseil-cpp\buildのなかみはどのようになっているでしょうか。
s_nmt

2020/06/12 07:04

cmake後のbuildフォルダ内は以下のようになっています。 ``` S:. | absl.sln | abslConfig.cmake | ALL_BUILD.vcxproj | ALL_BUILD.vcxproj.filters | CMakeCache.txt | cmake_install.cmake | INSTALL.vcxproj | INSTALL.vcxproj.filters | tree.txt | ZERO_CHECK.vcxproj | ZERO_CHECK.vcxproj.filters | +---absl \---CMakeFiles ```
Penpen7

2020/06/12 08:47 編集

cmake後はmakefileができるはずなのですが、代わりにslnファイルができているようですね 環境は違うのですが、手元にあるmacで行ったところ、makefileが作成されたあとmakeコマンドを実行してライブラリが作成されたことを確認できました。windowsではちょっと違うのでしょうか...確信はありませんが、slnファイルをVisual Studioで開き、その中でビルドできたりしないでしょうか。
s_nmt

2020/06/15 01:57

absl.slnをVisualStudioで開いてALL_BUILDを実行した結果以下のlibファイルが作成されました  abseil-cpp\build\lib\Debug   gmock_maind.lib   gmockd.lib   gtest_maind.lib   gtestd.lib これらをUE4のプロジェクトの  Plugins\TestPlugin\GrpcLibraries\Win64 にコピーしたあとビルドを行うと以下のエラーが出ました。 ``` 1>S:\PluginTest\Plugins\TestPlugin\GrpcLibraries\Win64\gmockd.lib : warning LNK4272: ライブラリのコンピューターの種類 'x86' がターゲットのコンピューターの種類' x64' と競合しています 1>S:\PluginTest\Plugins\TestPlugin\GrpcLibraries\Win64\gmock_maind.lib : warning LNK4272: ライブラリのコンピューターの種類 'x86' がターゲットのコンピューターの種類' x64' と競合しています 1>S:\PluginTest\Plugins\TestPlugin\GrpcLibraries\Win64\gtestd.lib : warning LNK4272: ライブラリのコンピューターの種類 'x86' がターゲットのコンピューターの種類' x64' と競合しています 1>S:\PluginTest\Plugins\TestPlugin\GrpcLibraries\Win64\gtest_maind.lib : warning LNK4272: ライブラリのコンピューターの種類 'x86' がターゲットのコンピューターの種類' x64' と競合しています 1>S:\PluginTest\Plugins\TestPlugin\Binaries\Win64\UE4Editor-TestPlugin.dll : fatal error LNK1120: 18 件の未解決の外部参照 ``` abslのビルドターゲットがWIN32になっていたのが原因かと思い 構成マネージャーにx64を追加してビルドしてみた結果 以下のようなエラーが大量に発生してビルドができませんでした。 ``` 44>------ すべてのリビルド開始: プロジェクト:absl_random_internal_fastmath_test, 構成: Debug x64 ------ 39>charconv_bigint.cc 44>C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\VC\VCTargets\Microsoft.CppBuild.targets(391,5): warning MSB8028: 中間ディレクトリ (x64\Debug\) に別のプロジェクト (absl_random_internal_fast_uniform_bits_test.vcxproj, random_internal_randen.vcxproj, random_internal_randen_slow.vcxproj, random_internal_randen_hwaes_impl.vcxproj, random_internal_randen_hwaes.vcxproj, random_seed_gen_exception.vcxproj) と共有されているファイルが含まれています。これにより、クリーンしてリビルド動作が適切に行われない可能性があります。 44>Building Custom Rule S:/PluginTest/Plugins/TestPlugin/grpc/third_party/abseil-cpp/absl/random/CMakeLists.txt 44>fastmath_test.cc 39>charconv_parse.cc 39>memutil.cc 44>x64\Debug\fastmath_test.obj : fatal error LNK1112: モジュールのコンピューターの種類 'x64' は対象コンピューターの種類 'x86' と競合しています。 44>プロジェクト "absl_random_internal_fastmath_test.vcxproj" のビルドが終了しました -- 失敗。 45>------ すべてのリビルド開始: プロジェクト:absl_random_internal_iostream_state_saver_test, 構成: Debug x64 ------ 45>C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\VC\VCTargets\Microsoft.CppBuild.targets(391,5): warning MSB8028: 中間ディレクトリ (x64\Debug\) に別のプロジェクト (absl_random_internal_fastmath_test.vcxproj, absl_random_internal_fast_uniform_bits_test.vcxproj, random_internal_randen.vcxproj, random_internal_randen_slow.vcxproj, random_internal_randen_hwaes_impl.vcxproj, random_internal_randen_hwaes.vcxproj, random_seed_gen_exception.vcxproj) と共有されているファイルが含まれています。これにより、クリーンしてリビルド動作が適切に行われない可能性があります。 45>Building Custom Rule S:/PluginTest/Plugins/TestPlugin/grpc/third_party/abseil-cpp/absl/random/CMakeLists.txt 45>iostream_state_saver_test.cc 39>match.cc 39>numbers.cc 46>------ すべてのリビルド開始: プロジェクト:absl_leak_check_test, 構成: Debug x64 ------ 46>C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\VC\VCTargets\Microsoft.CppBuild.targets(391,5): warning MSB8028: 中間ディレクトリ (x64\Debug\) に別のプロジェクト (debugging_internal.vcxproj, demangle_internal.vcxproj, leak_check_api_disabled_for_testing.vcxproj, leak_check_disable.vcxproj, leak_check_api_enabled_for_testing.vcxproj, leak_check.vcxproj, stacktrace.vcxproj, stack_consumption.vcxproj) と共有されているファイルが含まれています。これにより、クリーンしてリビルド動作が適切に行われない可能性があります。 46>Building Custom Rule S:/PluginTest/Plugins/TestPlugin/grpc/third_party/abseil-cpp/absl/debugging/CMakeLists.txt 46>leak_check_test.cc 45>x64\Debug\iostream_state_saver_test.obj : fatal error LNK1112: モジュールのコンピューターの種類 'x64' は対象コンピューターの種類 'x86' と競合しています。 45>プロジェクト "absl_random_internal_iostream_state_saver_test.vcxproj" のビルドが終了しました -- 失敗。 ``` 以降どうすればいいか調べていますが、解決方法をまだ見つけられていません…
s_nmt

2020/06/15 10: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 12:09

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

回答1

0

自己解決

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側のプロジェクトでビルドが通るか確認。

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

投稿2020/06/15 10:22

編集2020/06/15 10:24
s_nmt

総合スコア6

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問