2

Microsoft Visual Studio(c、c ++、fortran)で記述されたプログラムをmacOSXに移植しようとしています。このプログラム内には、Fortranソースコードによって呼び出されるc++関数があります。基本的に、そのインターロッピングC++とFortran。C ++関数を"extern C"角かっこで囲みました。これは、インターネット経由で適切な方法であると言われています。ただし、リンカはまだこのc++関数内の未定義のシンボルについて不平を言っています...

Undefined symbols:
  "__Z7_getcwdPci", referenced from:
      _bisimr_ in bisimR.o
ld: symbol(s) not found

インターネットを見るgetcwdと、ヘッダーファイルで定義されている関数です"direct.h"。これはMacOSの一部ではなく、Windowsシステムにのみ固有のものです。私の知る限り、Windowsの「direct.h」ファイルのように見えるファイルをインターネット上で見つけることができました。

コンテキストが完了したので、ここに私の質問があります

エラーが発生した場合、私のdirect.hファイルがWindowsの一部である正しいヘッダーファイルではない可能性がありますか?または、名前マングリング、C ++からFortranに移行して、このエラーをスローしますか?

ノート:

  • このエラーをスローするライブラリのリンクであるコンパイル段階を通過できます。
  • bisimr_C++関数です
4

1 に答える 1

2

私があなたの質問を理解している限り、あなたはWindowsシステムからヘッダーファイルをコピーすることによってプログラムを構築しようとしました。今のところ?そのアプローチは必ず失敗します。ヘッダーファイルが存在すると、 Windowsシステムで使用できる関数に関する情報がコンパイラに提供されますが、リストされているライブラリのいずれもその名前の関数を定義していないため、リンカは文句を言います。

システムに付属しているヘッダー、またはシステム用に既に正常にコンパイルされているサードパーティのライブラリからのヘッダーのみを使用する必要があります。ソースコードのみのヘッダー(特にテンプレートライブラリ)もOKです。他のヘッダーの使用は、リンカーエラーを要求するだけです。

名前が壊れているように見えるという事実は、コンパイラーがそれをオーバーロードされている可能性のあるC ++関数と見なしていることを示しているため、名前に引数の型に関する詳細が含まれます。#includeこの側面は、ステートメントをextern "C"ブロックで囲むことによって回避できる場合があります。Windowsファイルの場合、direct.hこれは上記の問題を解決しませんが、おそらくそれはあなたにunistd.h役立つでしょう:

extern "C" {
#include <unistd.h>
}
于 2012-06-26T17:05:01.930 に答える