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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

1回答

3422閲覧

[C++] AWS IoT C++ Device SDK v2 でリンカーエラー

ruku_tera

総合スコア1

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2021/07/07 06:45

編集2021/07/08 00:10

前提・実現したいこと

まず、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 で作業しています。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/07/07 23:15 編集

> LNK2001:外部シンボル ~~ は未解決です。 この~~の部分が多分解決のヒントになると思われますので、きちんと記載した方が良いでしょう。 githubのIssuesに同じ事例が無い場合、そちらに報告した方が良いかもしれません。
ruku_tera

2021/07/08 00:13

ありがとうございます。 エラー内容を追記しました。 引き続き、調査や対応を検討してみます。 # 情報が見当たらない感じ、使い方ミスの可能性が高いかなーと。思っています。
退会済みユーザー

退会済みユーザー

2021/07/08 00:33 編集

未解決のクラス・関数名等を含むソースがコンパイルやリンク対象から抜けているという事は無さそうですか?(または必要なlibが存在するなら、それをリンクしていないか)
ruku_tera

2021/07/13 07:57

その後、コンパイラのバージョンが異なってないか?や、 プロジェクトの設定は本当に正しい?や、 Lib内の名前マングリングの結果とエラーメッセージのは一致してる?など、 試行錯誤を繰り返し、進展しました。(たぶん) 最終的にエラーは4つ(2種)まで減り、 __GSHandlerCheck_EH4/__CxxFrameHandler4 が未解決な状況です。 Web検索するとVSのバージョンがどうのという情報があるので、 VS2017/VS2019の環境作りつつ継続します。 経過報告でした。
guest

回答1

0

自己解決

作業している環境には様々なツールや開発環境がインストールされており
正しく設定しているつもりでも何か間違っている可能性もあると考え、
比較的キレイなPCで試してみました。

(それでも、すんなりとはいかなかったのですが…)
結果的にVS2019を使ってエラーが解消されました。
直接の要因を追究するのはまたの機会にするとして、下記の流れで上手くいきました。

・別PCにVS2019インストール。(結果的に不要かもですが、v140/v141ツールセット追加)
・VS2019でGitHubからSDKのソース取得しLib作成。
・VS2019で上記Lib参照したC++ DLLを作成。
・元PCのVS2015でC#プロジェクト作り、上記DLLをDllImportで参照。(これは私の都合でVS2015なだけ)
→ 成功!

会社の開発環境に不要なVisualStudioを入れたくないので、
実際何が悪かったのかは微妙に分かっていません。
今のままだと、2箇所で作業しないといけないので少々面倒。

ひとまず解決とします。
ありがとうございました。

投稿2021/07/20 06:49

ruku_tera

総合スコア1

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問