iOSアプリ開発でIdOpenSSLSetLibPathが「未定義の識別子」となるエラーを無くすには?

解決


ミロ  2018-07-10 20:13:27  No: 49279

いつもお世話になっております。 
以前の質問にタイトルも本文も誤りがありました。
修正して改めて質問させて下さい。

iOSとAndroidでアプリにメールの送信機能を入れて開発をしています。 
OpenSSLを使いGmailを通して送信するようにしています。 

その際、libcryptoとlibsslを読み込むためにIdOpenSSLSetLibPath関数を使っています。 
Android版では上手くいき使えています。 

しかし、ターゲットプラットフォームにiOSやiOSSimulatorを選ぶと、IdOpenSSLSetLibPath関数に赤い波線が付き、ビルドするとエラーが出てしまいます。 
usesにはIdSSLOpenSSLHeaders_staticを入れております。 
ここからどのように進めればよいのでしょうか? 
お知恵をお貸し下さい。 

開発環境は以下の通りです。 
PCはMacBook AirでMacOS10.12.6です。 
Parallelsを通してWindows10につないでいます。 
Delphi 10.2を使っています。 
どうぞよろしくお願いいたします。


通りすがり  2018-07-10 22:23:57  No: 49280

OpenSSL のサポート - iOS アプリケーションの作成
http://docwiki.embarcadero.com/RADStudio/Tokyo/ja/IOS_%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E4%BD%9C%E6%88%90#OpenSSL_.E3.81.AE.E3.82.B5.E3.83.9D.E3.83.BC.E3.83.88

を読むとiOSでは静的なライブラリ(*.a)しかサポートしていないので、ソースコードから.aを生成してプロジェクトフォルダに
置け、みたいなことが書いてありますが、この話ですかね?


ミロ  2018-07-12 02:33:37  No: 49281

>通りすがりさん

いつもお世話になっております。

>を読むとiOSでは静的なライブラリ(*.a)しかサポートしていないので、ソースコードから.aを生成してプロジェクトフォルダに 
>置け、みたいなことが書いてありますが、この話ですかね?

http://www.moonxseed.com/2012/03/12/ios-用-openssl-ライブラリの作成/
こちらを参考にライブラリを作成しました。
そしてできた.aをプロジェクトのフォルダに置き、配置マネージャーで設定したのですが、エラーは変わらずの状態です。


通りすがり  2018-07-12 04:10:32  No: 49282

docwikiの当該記事は

iOSシミュレータでは.libを配置してその場所をIdOpenSSLSetLibPath関数で指定して動的リンクする
iOSデバイスでは.aをプロジェクトフォルダに置いて静的リンクする

と読めるのですが、どうでしょう?

で、

Using Open SSL in Delphi iOS
http://blog.marcocantu.com/blog/using_ssl_delphi_ios.html

を読むと、IdSSLOpenSSLHeaders_Staticをusesするだけで必要な.aファイルがリンクされる、とあります。

ですので、ターゲットデバイスにあわせて

uses
  IdSSLOpenSSLHeaders_Static;

...(省略)

{$IFDEF IOS}
{$IFNDEF CPUARM}
IdOpenSSLSetLibPath(なんちゃら);
{$ENDIF}

とでもすればいいんじゃないでしょうか。マルチプラットフォーム開発をするのであれば

定義済みの条件シンボル
http://docwiki.embarcadero.com/RADStudio/Tokyo/ja/%E6%9D%A1%E4%BB%B6%E4%BB%98%E3%81%8D%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB%EF%BC%88Delphi%EF%BC%89#.E5.AE.9A.E7.BE.A9.E6.B8.88.E3.81.BF.E3.81.AE.E6.9D.A1.E4.BB.B6.E3.82.B7.E3.83.B3.E3.83.9C.E3.83.AB

にも目を通しておいたほうがいいと思います。


ミロ  2018-07-12 20:10:25  No: 49283

>通りすがりさん

ありがとうございます。
>定義済みの条件シンボル 
http://docwiki.embarcadero.com/RADStudio/Tokyo/ja/%E6%9D%A1%E4%BB%B6%E4%BB%98%E3%81%8D%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB%EF%BC%88Delphi%EF%BC%89#.E5.AE.9A.E7.BE.A9.E6.B8.88.E3.81.BF.E3.81.AE.E6.9D.A1.E4.BB.B6.E3.82.B7.E3.83.B3.E3.83.9C.E3.83.AB 
>にも目を通しておいたほうがいいと思います。

目を通しました。初見の私には暗号のような文章でした。
iOS用のコンパイラがARMに基づいている、ところが関係があるのでしょうか?
何回か読んで理解しようと頑張ってみます。

>{$IFDEF IOS} 
>{$IFNDEF CPUARM} 
>IdOpenSSLSetLibPath(なんちゃら); 
>{$ENDIF}

このように書くと、たしかにIdOpenSSLSetLibPathに赤い波線がなくなり、ビルドしてもここで引っかからなくなりました。

ただ、「E2280  条件指令が正しく終わっていません」のエラーが出るようになりました。
2つのIFに対してENDIFが1つなので足りていないのかと、ENDIFを加えると、「F2588  リンカエラーコード」のエラーが出てしまいました。
 今度は別の種類のエラーでしょうか?
F2588を調べると、アップデートサブスクリプションでアップデートするように出てきました。
それと関係があるのでしょうか?


通りすがり  2018-07-13 01:22:22  No: 49284

おっと、{$ENDIF}が1つ足りていませんでしたね。Androidのことを考えると

{$IFDEF IOS} 
{$IFNDEF CPUARM} 
IdOpenSSLSetLibPath(なんちゃら); 
{$ENDIF} 
{$ENDIF} 
{$IFDEF ANDROID} 
IdOpenSSLSetLibPath(かんちゃら); 
{$ENDIF} 

とするべきでした。

コンパイルエラーが出たときは適当に拾うのではなく、エラーメッセージをコピーアンドペーストでなるべく
そのまま提示したほうが適切な回答がつきやすいです。

Delphi F2588で検索すると プロジェクト→右クリック→クリーン で一旦クリーンアップしてから再度コンパイル
するといい、とか出てきますけど、試してみてはどうでしょう。


ミロ  2018-07-13 19:47:12  No: 49285

>通りすがりさん

ありがとうございます。

>コンパイルエラーが出たときは適当に拾うのではなく、エラーメッセージをコピーアンドペーストでなるべく 
>そのまま提示したほうが適切な回答がつきやすいです。 
承知しました。今後そのようにいたします。

>Delphi F2588で検索すると プロジェクト→右クリック→クリーン で一旦クリーンアップしてから再度コンパイル 
>するといい、とか出てきますけど、試してみてはどうでしょう。
「クリーンアップ」ですね。早速やってみました。
以下のようなエラーが出ました。
[DCC エラー] E2597 ld: warning: directory not found for option '-F\\Mac\Home\Documents\Embarcadero\Studio\SDKs\iPhoneOS11.2.sdk\System\Library\PrivateFrameworks'
  ld: file not found: /System/Library/Frameworks/FileProvider.framework/FileProvider for architecture arm64
[DCC 致命的エラー] F2588 リンカ エラー コード: 1 ($00000001)

ググると以下のサイトの情報が出てきました。
http://delphiworlds.com/2013/10/adding-other-ios-frameworks-to-the-sdk-manager/
こちらに載っている方法も試したのですが、結果は変わらずでした。


KONNOYA  2018-07-15 09:28:52  No: 49286

ちょっといま手元に環境が無いので試していませんが、
そのエラーはiOS 64ビットのSDKに「FileProvider」が含まれていない為に出るエラーなのかも知れません。

[Delphiメニュー] → [ツール] → [オプション] → [SDKマネージャ] → [iOS 64bit]を選択して、一覧表を確認してみて下さい。

一覧表にFileProviderがあるけれども、実際のSDKが格納されているフォルダに「FileProvider」が無いのだと思います。

検索してみた結果、同じエラーで質問されている方が居ました。
[DCC エラー] E2597

① https://forums.embarcadero.com/message.jspa?messageID=902250
② https://stackoverflow.com/questions/49185180/when-i-try-running-on-ios-delphi-says-im-missing-a-file#

②の方は文章を読む限り、FileProviderのフォルダを作成しただけでコンパイル成功!
と書かれている様です…が、その直し方が正しいのかは判りません。

ちなみにMacintoshからのSDKファイルの読み取りですが、
「ローカルファイルキャッシュの更新」ボタンを押すと、
MacintoshからDelphiへSDKファイルを読み込んで、DelphiのiOS SDKを更新できます。
現状の物に読み込んでしまうと、元に戻せなくなるので、
必ず「追加」ボタンで新たなSDKバージョンのリストを作ってからにして下さい。

https://community.embarcadero.com/blogs/entry/xcode-paserver-delphi-c-builder-ios-macos-japan

ここを読んでから行った方が良いかも。
あ、これはもう初回にやってますね。


ミロ  2018-07-17 19:03:18  No: 49287

KONNOYAさん

いつもありがとうございます。
②が単純なのでやってみましたが、結果は変わりませんでした。
①を試してみます。


ミロ  2018-07-17 19:33:48  No: 49288

KONNNOYAさん

①の作業を行ってみました。
Macのターミナルを使う作業で大変でした。
それで「実行」すると、今度は「FMX.Platform.iOSが見つかりません」のエラーが出てしましました。
念のためプラットフォーム管理でiOSを再インストールしています。
元に戻ったのか、同じE2597とF2588のエラーが出る状態になりました。

表題のエラーは解決したので、新たに質問を立て直します。
今後ともよろしくお願いいたします。


ミロ  2018-07-17 19:34:35  No: 49289

タイトルのエラーは解決しました。
ありがとうございます。


※返信する前に利用規約をご確認ください。








  このエントリーをはてなブックマークに追加