いつもお世話になっております。
以前の質問にタイトルも本文も誤りがありました。
修正して改めて質問させて下さい。
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を使っています。
どうぞよろしくお願いいたします。
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を生成してプロジェクトフォルダに
置け、みたいなことが書いてありますが、この話ですかね?
>通りすがりさん
いつもお世話になっております。
>を読むとiOSでは静的なライブラリ(*.a)しかサポートしていないので、ソースコードから.aを生成してプロジェクトフォルダに
>置け、みたいなことが書いてありますが、この話ですかね?
http://www.moonxseed.com/2012/03/12/ios-用-openssl-ライブラリの作成/
こちらを参考にライブラリを作成しました。
そしてできた.aをプロジェクトのフォルダに置き、配置マネージャーで設定したのですが、エラーは変わらずの状態です。
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
>にも目を通しておいたほうがいいと思います。
目を通しました。初見の私には暗号のような文章でした。
iOS用のコンパイラがARMに基づいている、ところが関係があるのでしょうか?
何回か読んで理解しようと頑張ってみます。
>{$IFDEF IOS}
>{$IFNDEF CPUARM}
>IdOpenSSLSetLibPath(なんちゃら);
>{$ENDIF}
このように書くと、たしかにIdOpenSSLSetLibPathに赤い波線がなくなり、ビルドしてもここで引っかからなくなりました。
ただ、「E2280 条件指令が正しく終わっていません」のエラーが出るようになりました。
2つのIFに対してENDIFが1つなので足りていないのかと、ENDIFを加えると、「F2588 リンカエラーコード」のエラーが出てしまいました。
今度は別の種類のエラーでしょうか?
F2588を調べると、アップデートサブスクリプションでアップデートするように出てきました。
それと関係があるのでしょうか?
おっと、{$ENDIF}が1つ足りていませんでしたね。Androidのことを考えると
{$IFDEF IOS}
{$IFNDEF CPUARM}
IdOpenSSLSetLibPath(なんちゃら);
{$ENDIF}
{$ENDIF}
{$IFDEF ANDROID}
IdOpenSSLSetLibPath(かんちゃら);
{$ENDIF}
とするべきでした。
コンパイルエラーが出たときは適当に拾うのではなく、エラーメッセージをコピーアンドペーストでなるべく
そのまま提示したほうが適切な回答がつきやすいです。
Delphi F2588で検索すると プロジェクト→右クリック→クリーン で一旦クリーンアップしてから再度コンパイル
するといい、とか出てきますけど、試してみてはどうでしょう。
>通りすがりさん
ありがとうございます。
>コンパイルエラーが出たときは適当に拾うのではなく、エラーメッセージをコピーアンドペーストでなるべく
>そのまま提示したほうが適切な回答がつきやすいです。
承知しました。今後そのようにいたします。
>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/
こちらに載っている方法も試したのですが、結果は変わらずでした。
ちょっといま手元に環境が無いので試していませんが、
そのエラーは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
ここを読んでから行った方が良いかも。
あ、これはもう初回にやってますね。
KONNOYAさん
いつもありがとうございます。
②が単純なのでやってみましたが、結果は変わりませんでした。
①を試してみます。
KONNNOYAさん
①の作業を行ってみました。
Macのターミナルを使う作業で大変でした。
それで「実行」すると、今度は「FMX.Platform.iOSが見つかりません」のエラーが出てしましました。
念のためプラットフォーム管理でiOSを再インストールしています。
元に戻ったのか、同じE2597とF2588のエラーが出る状態になりました。
表題のエラーは解決したので、新たに質問を立て直します。
今後ともよろしくお願いいたします。
タイトルのエラーは解決しました。
ありがとうございます。
ツイート | ![]() |