10

私の会社には、たくさんの Fortran コードがあります。従来、必要なコードを .dll にコンパイルし、計算が必要なときにその .dll を呼び出していました。現在、iPad アプリを作成しようとしていますが、残念ながら .dll を呼び出すことはできません。

私の同僚の 1 人が、簡単なコマンド ライン ツール プロジェクトを作成しました。このプロジェクトでは、Fortran ファイルを呼び出して、デバッガーに「Hello, World」と書き込みます。ただし、ビューベースの iPad アプリで動作させようとすると、使用しているシンボルが見つからないというリンカ エラーが大量に発生します。コマンド ライン ツールが実際に Fortran を実行するために .cpp ファイルを使用することは知っています。アプリで .cpp ファイルを呼び出すことに関する多くのスレッドを見てきましたが、私が見たものはすべて時代遅れであり、直接互いに矛盾しています。そして彼らの修正は私にはうまくいきません。

私の質問は、Fortran を .m ファイルから直接呼び出すより直接的な方法はありますか? そうでない場合、動作するコマンド ライン ツールをアプリに組み込むにはどうすればよいですか?

更新 1: コメントに投稿されたチュートリアルに従って、Fortran コードから .o ファイルを作成できました。File-Add Files を実行して簡単に追加できますが、実際にどのように呼び出すのでしょうか?

更新 2: わかりました、ベイビー ステップです。ターミナル コマンドを使用して、.o ファイル ("source_file.o") から .a スタティック ライブラリ ("new_library" と呼びます) を作成できることがわかりました (追加するar crv new_library.a source_file.oだけで、複数の .o ファイルに対して実行できます)。source_file2.o source_file3.o必要な数の .o ファイル - 注: 必ず使用してくださいcd.o ファイルがあるフォルダーに移動します)。Xcode は .a ファイルで動作すると確信していますが、プロジェクト内の他のファイル (View Controller など) が .a ファイルの内容を呼び出せるようにするには、.h ファイルが必要なようです。Xcode 自体から新しい .a ファイルを作成できることはわかっています (New Project -> iOS -> Framework & Library -> Cocoa Touch Static Library)。 m および .h ファイルであり、新しいライブラリをビルドすると、すべての .m ファイルが 1 つの .a にマッシュアップされます。その .a のコードを別のプロジェクトで使用したい場合は、.a ファイルとすべての .h ファイルを新しいプロジェクトにインポートするだけで、すべてをインポートしたかのように .a ファイルのメソッドを呼び出すことができます。個別の .m ファイル。では、次の質問は、.a が Xcode ではなく端末で作成された場合、.h はまだ必要ですか? その場合、Fortran ヘッダー ファイルを作成するにはどうすればよいですか? そうでない場合、.a で Fortran コードを呼び出すにはどうすればよいですか?

4

1 に答える 1

4

要約してみましょう:

  1. ARM コードを生成できる FORTRAN クロス コンパイラが必要です。GCC はおそらく良い選択です。ただし、ソース ダウンロードから自分でビルドする必要があります。

  2. FORTRAN コードをコンパイルして、静的ライブラリに入れます。このタスクは、おそらくコマンド ラインから、XCode の外部で実行されます。

  3. C から直接呼び出す FORTRAN ルーチンの C ヘッダー ファイルを作成します。Fortran と C/C++ の混合プログラミングまたはチュートリアル: C/C++ と Fortran を一緒に使用する を参照してください。これらのページでは、C データ型を FORTRAN データ型に、またはその逆にマップする方法について説明します。

  4. C ヘッダー ファイルとスタティック ライブラリを XCode プロジェクトに追加します。

  5. 必要に応じて C ヘッダー ファイルを Objective-C ファイル (.m) にインポートし、C 関数のように FORTRAN ルーチンを呼び出します。

  6. XCode を使用して iOS アプリをビルドします。

于 2012-12-06T15:01:11.763 に答える