前提・実現したいこと
まず、C/C++は素人に近いです。C#はそこそこ詳しいと思います。
DllImportなど使った経験は何度かあり、
本当に簡単なC++のDLLを自作して、C#から呼んだ経験もあります。
表題の通り、AWS IoT C++ Device SDKを利用しようとしています。
https://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/iot-sdks.html
最終的には作成したDLLをC#から呼ぼうと考えています。
理由としてはAWS IoT Device SDKが.NETをサポートしていない為です。
現状、まだC#は登場していない段階で、
C++のDLLを作成しようとしてコンパイルエラーとなっています。
発生している問題・エラーメッセージ
LNK2001:外部シンボル ~~ は未解決です。 <追記> 後述のソースで7件程。テストコード全体では20件程出ています。 長いですが7件分を記載します。 パス含んでますが問題ない範囲かな。 エラー LNK1120 7 件の未解決の外部参照 AwsIotDeviceSdkWrap C:\tools\sdk-cpp-workspace\aws-iot-device-sdk-cpp-v2-build\x64\Release\AwsIotDeviceSdkWrap.dll 1 エラー LNK2001 外部シンボル ""public: virtual __cdecl Aws::Crt::Io::DefaultHostResolver::~DefaultHostResolver(void)" (??1DefaultHostResolver@Io@Crt@Aws@@UEAA@XZ)" は未解決です。 AwsIotDeviceSdkWrap C:\tools\sdk-cpp-workspace\aws-iot-device-sdk-cpp-v2-build\AwsIotDeviceSdkWrap\AwsIotDeviceSdkWrap.obj 1 エラー LNK2001 外部シンボル ""public: __cdecl Aws::Crt::Io::ClientBootstrap::ClientBootstrap(class Aws::Crt::Io::EventLoopGroup &,class Aws::Crt::Io::HostResolver &,struct aws_allocator *)" (??0ClientBootstrap@Io@Crt@Aws@@QEAA@AEAVEventLoopGroup@123@AEAVHostResolver@123@PEAUaws_allocator@@@Z)" は未解決です。 AwsIotDeviceSdkWrap C:\tools\sdk-cpp-workspace\aws-iot-device-sdk-cpp-v2-build\AwsIotDeviceSdkWrap\AwsIotDeviceSdkWrap.obj 1 エラー LNK2001 外部シンボル ""public: __cdecl Aws::Crt::Io::ClientBootstrap::~ClientBootstrap(void)" (??1ClientBootstrap@Io@Crt@Aws@@QEAA@XZ)" は未解決です。 AwsIotDeviceSdkWrap C:\tools\sdk-cpp-workspace\aws-iot-device-sdk-cpp-v2-build\AwsIotDeviceSdkWrap\AwsIotDeviceSdkWrap.obj 1 エラー LNK2001 外部シンボル ""public: __cdecl Aws::Crt::Io::DefaultHostResolver::DefaultHostResolver(class Aws::Crt::Io::EventLoopGroup &,unsigned __int64,unsigned __int64,struct aws_allocator *)" (??0DefaultHostResolver@Io@Crt@Aws@@QEAA@AEAVEventLoopGroup@123@_K1PEAUaws_allocator@@@Z)" は未解決です。 AwsIotDeviceSdkWrap C:\tools\sdk-cpp-workspace\aws-iot-device-sdk-cpp-v2-build\AwsIotDeviceSdkWrap\AwsIotDeviceSdkWrap.obj 1 エラー LNK2001 外部シンボル ""public: __cdecl Aws::Crt::Io::EventLoopGroup::EventLoopGroup(unsigned short,struct aws_allocator *)" (??0EventLoopGroup@Io@Crt@Aws@@QEAA@GPEAUaws_allocator@@@Z)" は未解決です。 AwsIotDeviceSdkWrap C:\tools\sdk-cpp-workspace\aws-iot-device-sdk-cpp-v2-build\AwsIotDeviceSdkWrap\AwsIotDeviceSdkWrap.obj 1 エラー LNK2001 外部シンボル ""public: __cdecl Aws::Crt::Io::EventLoopGroup::~EventLoopGroup(void)" (??1EventLoopGroup@Io@Crt@Aws@@QEAA@XZ)" は未解決です。 AwsIotDeviceSdkWrap C:\tools\sdk-cpp-workspace\aws-iot-device-sdk-cpp-v2-build\AwsIotDeviceSdkWrap\AwsIotDeviceSdkWrap.obj 1 エラー LNK2001 外部シンボル ""struct aws_allocator * Aws::Crt::g_allocator" (?g_allocator@Crt@Aws@@3PEAUaws_allocator@@EA)" は未解決です。 AwsIotDeviceSdkWrap C:\tools\sdk-cpp-workspace\aws-iot-device-sdk-cpp-v2-build\AwsIotDeviceSdkWrap\AwsIotDeviceSdkWrap.obj 1
該当のソースコード
C++
1#include <aws/crt/Api.h> 2#include <aws/crt/StlAllocator.h> 3#include <aws/crt/auth/Credentials.h> 4#include <aws/crt/io/TlsOptions.h> 5#include <aws/iot/MqttClient.h> 6#include <aws/crt/UUID.h> 7 8extern "C" void __declspec(dllexport) Test() { 9 Aws::Crt::Io::EventLoopGroup eventLoopGroup(1); 10 Aws::Crt::Io::DefaultHostResolver defaultHostResolver(eventLoopGroup, 1, 5); 11 Aws::Crt::Io::ClientBootstrap bootstrap(eventLoopGroup, defaultHostResolver); 12 13 ~~~ (以下、続きますが ここまででも再現します) 14}
試したこと
まずC++/CLIでWrapすることを検討していましたが、
どうやらSDKがCLIから利用できないようだと結論に至りました。
(VisualStudioのエラーメッセージやWeb検索より)
なのでC++で実装を行い、C#から関数を呼ぼうとしているのが今です。
C++のビルドも大した自信があるわけではありませんが、
SDKのGitHubに倣って.h/.libは一通り取得できました。
エラーに関してはメッセージの通りリンカーエラーだと思っています。
下記はプロジェクトのプロパティから設定しています。
・追加のインクルードディレクトリ
・追加のライブラリディレクトリ
・追加の依存ファイル
SDKはCとC++が混在しているようですし、
C/C++間のマングリングというのが問題なのかと考え、
C++
1extern "C" { 2 #include <aws/crt/Api.h> 3}
としてみましたが、今度は下記のエラーになりました。
この宣言には外部 'C' リンケージがあってはなりません <追記> 数千行エラーあったのですが、他の種類も出ていました。 テンプレートは 'C' リンケージ用に宣言できません。 リテラル演算子に外部 'C' の名前リンケージを指定することはできません オーバーロードされた関数 "abs" の複数のインスタンスに 'C' リンケージがあります オーバーロードされた関数 "acos" の複数のインスタンスに 'C' リンケージがあります ……以下複数の関数
このエラーは何も対処が分かっていません。
とりあえず、背景を説明するためにC#の話題も出しましたが、
C++でこのSDKを使えるようになるのが目下の目標となります。
補足情報(FW/ツールのバージョンなど)
GitHubに倣いcmakeインストールし、コンソールから実施。
その後は開発環境:VisualStudio 2015 で作業しています。
回答1件
あなたの回答
tips
プレビュー