AzureSphere開発でSDKのライブラリのリンクを追加する方法
初めてのAzureSphere開発で少しハマったので記録します。
立上げ
まず今回作りたかった製品をざっくり言うと、UARTで受信したデータをhttpでwebサーバにアップロードしていくという製品です。
開発環境はMSのドキュメントに従ってVisual Studio Codeの環境を立上げました。
チュートリアルのLチカサンプルで環境構築に成功したことを確認し、いざ実装。
楽勝?
UARTの実装を順調にこなし(GitHubからサンプルをクローンしただけ 笑)http処理部分に取り掛かります。
SDKのcurl使えばいいんでしょ。MSのドキュメントもあるし楽ショーじゃね。
とか調子に乗り始めたところでコケました。。。
なんでビルドが通らない
MSのドキュメントの手順を踏んでビルドしましたが下記のビルドエラー発生。
[build] C:\prj\SW\soft\AzureSphere\out\ARM-Debug/../../main.c:438: undefined reference to `curl_slist_append'
[build] C:/Program Files (x86)/Microsoft Azure Sphere SDK/Sysroots/6/tools/gcc/real-ld.exe: C:\prj\SW\soft\AzureSphere\out\ARM-Debug/../../main.c:439: undefined reference to `curl_global_init'
[build] C:/Program Files (x86)/Microsoft Azure Sphere SDK/Sysroots/6/tools/gcc/real-ld.exe: C:\prj\SW\soft\AzureSphere\out\ARM-Debug/../../main.c:440: undefined reference to `curl_easy_init'
・・・
curlの関数が定義されていない的なエラーだけどcurl/curl.hのインクルードはちゃんとしています。
しかも同じSDKで定義されている applibs/uart.h の関数は正常にビルドされている。なんで?
# include <applibs/storage.h> // required only if you supply a certificate in the image package
# include <tlsutils/deviceauth_curl.h> // required only for mutual authentication
# include <curl/curl.h>
# include <curl/easy.h>
解決方法
・・・
小一時間MSのドキュメントとプロジェクトファイルの行き来を繰り返し、解決方法を発見しました。
↓これを。。。
target_link_libraries(${PROJECT_NAME} applibs pthread gcc_s c)
↓こう!
target_link_libraries(${PROJECT_NAME} applibs curl pthread gcc_s c)
結論としてはtarget_link_librariesでcurlのリンクを追加する必要があったみたいです。
CMakeを普段から使っている人からすると常識かもしれませんが、CMakeビギナーの自分には難問でした。。。
参照したサイト
Azure Sphere のドキュメント | Microsoft Docs(https://docs.microsoft.com/ja-jp/azure-sphere/)