1

MATLAB から C++ にいくつかのコードを移植していて、MATLAB の sin() および cos() 関数が C++ ライブラリの sin() および cos() 関数とはわずかに異なる結果を生成することを発見しました。これらの違いをなくすために、C++ コードで fdlibm 5.3 ライブラリから sin() および cos() 関数を呼び出すようにします。これは、MATLAB が sin() および cos() 操作に使用すると思われるものです。

ただし、fdlibm ライブラリを使用するのに苦労しています。Visual Studio 2010 を使用しており、fdlibm ヘッダー ファイルとソース コードをhttp://www.validlab.com/software/からダウンロードしましたが、これらのファイルを使用する最適な方法がわかりません。最初にファイルを静的ライブラリまたは動的ライブラリにビルドしてから、コードにリンクする必要がありますか? また、C++ ライブラリではなく fdlibm から sin() を使用することを指定するにはどうすればよいですか? sin() 関数と cos() 関数が名前空間内にあるように、fdlibm ソース コードを変更する必要がありますか?

どんなガイダンスも大歓迎です。

4

1 に答える 1

0

基本的に、次の 2 つのタスクを完了する必要があります。

  • fdlibm ソースをコンパイルして、目的に適したオブジェクト モジュールを生成する必要があります。
  • オブジェクト モジュールを他のオブジェクト モジュールとリンクする必要があります。

最初のタスクには 2 つの問題があります。1 つ目は、fdlibm などのプロジェクトのソースは通常、多くのシステムに移植できるように作成されており、構成にかなりの作業が必要になる場合があることです。非常に単純な C または C++ コードではなく、いくつかのプリプロセッサ条件を使用して特定のオプションを選択する場合があり、ソースが含まれるパッケージには、コンパイルのさまざまな準備を行うためのスクリプトが含まれる場合があります。

2 つ目は、ソースが C++ 標準の宣言sinとの仕様に一致するようにすることですcos。あなたが持っている fdlibm パッケージが C++ をサポートしている場合、これはあなたの側での作業を必要としないかもしれません。それ以外の場合は、ソースを変更してsinとのcos定義を std 名前空間内にラップするか、ソースを変更する必要があります。

2番目の問題はリンクです。ライブラリを使用する必要はありません。を含むソース ファイルをコンパイルしてオブジェクト モジュール (またはモジュール)sincos生成し、そのオブジェクト モジュール (またはモジュール) を他のオブジェクト モジュールにリンクするだけです。必要に応じて、代わりにライブラリを作成し、オブジェクト モジュールを配置してsincosライブラリに追加し、ライブラリをオブジェクト モジュールにリンクします。ほとんどの一般的なリンカでは、オブジェクト モジュールをリストするのと同じ方法で、ライブラリをリンカの入力としてリストするだけで、ライブラリをオブジェクト モジュールとリンクできます。(リンカーによっては、ライブラリを参照するための他のオプションもありますが、通常は通常のファイル パスを指定するだけで十分です。) 必要に応じて、静的ライブラリまたは動的ライブラリのいずれかを作成およびリンクできます。動的ライブラリを使用する場合は、実行可能ファイルの実行時に存在する必要があります。自分で使用する単純なアプリケーションの場合、動的ライブラリを使用する必要はありません (または静的ライブラリを使用する必要さえありません。オブジェクト モジュールは問題ありません)。(基本的に、ライブラリの目的は、オブジェクト モジュールを他の人に簡単に配布したり、大規模なプロジェクトを編成したりすることです。単純なアプリケーションにはライブラリは必要ありません。)

リンクに関するもう 1 つの注意事項: 独自の sin と cos を指定すると、リンカは次の 2 つの実装から選択できます: sin と cos の独自の実装と、sin と cos の標準ライブラリの実装です。通常、標準ライブラリはユーザー指定のファイルの後にリンクされるため、オブジェクト モジュールまたはライブラリを指定するだけで、ライブラリの sin と cos ではなく、sin と cos が確実に使用されるようになります。そうでない場合は、ライブラリが考慮される順序を変更するリンカー オプションが必要です。

于 2012-08-26T12:00:16.537 に答える