2

C コードを使用して作成された外部ライブラリがあります。C++ プロジェクトでライブラリから関数を呼び出したいと考えています。関数プロトタイプの元の形式は .

extern void butterThreeBp(real_T eml_dt, real_T eml_fl, real_T eml_fu, real_T eml_b3[7], real_T eml_a3[7]);

そして、これによりMSVC2008で次のリンカエラーが発生しました

error LNK2019: unresolved external symbol "void __cdecl butterThreeBp(double,double,double,double * const,double * const)" (?butterThreeBp@@YAXNNNQAN0@Z) referenced in function "public: void __thiscall myThread::setDRNLc(double)" (?setDRNLc@myThread@@QAEXN@Z)

次に、このプロトタイプを次のように変更しました

extern "C" void ...

そして、次のエラーが発生します。

\butterThreeBp.lib : fatal error LNK1127: library is corrupt

ライブラリを何度も再構築しましたが、破損していないことは確かです。どんな助けでも素晴らしいでしょう。ありがとう!!

4

3 に答える 3

2

付属の LCC コンパイラを MATLAB で使用する必要はありません。最も簡単な解決策は、MATLAB で VC++ を使用することです。http://www.mathworks.com/support/compilers/R2010b/index.html

于 2010-10-13T11:20:21.623 に答える
1

IIRC では、C++ コンパイラでコンパイルする場合にのみ extern "C" を追加する必要があります。

そんな感じ:

#ifdef __cplusplus
extern "C" {
#endif

// the declarations

#ifdef __cplusplus
}
#endif  
于 2010-10-13T02:04:42.453 に答える
0

とった!私はMATLAB組み込みコーダーを使用してライブラリコードを生成し、MatlabのLcc組み込みコンパイラを使用してライブラリを構築していました。私はMSVCでメインアプリケーションに取り組んでいるので、ライブラリ(Lcc)とメインプロジェクト(MSVC)の間に呼び出し規約の問題があったに違いないと思います。この問題は、Lccを使用して生成されたにもかかわらず、私のライブラリの1つ(ButterOneLp)が正常に機能したため、特に見つけるのが困難でした。ただし、別のライブラリは機能しませんでした。

この問題は、

mex -setup

。。。MATLABでコマンドを実行し、デフォルトのコンパイラをデフォルトのLccではなくMSVCに変更します。

Lccはgccに基づいていると思うので、MSVCからgcc /lccライブラリを呼び出すことができるようにC++コードの呼び出し規約を変更する方法を知っている人がいればそれは素晴らしいことです。しかし、それは投稿された元の質問とはまったく異なる質問です。

この話の教訓は、「致命的なエラーLNK1127:ライブラリが破損しています」が発生した場合に、ライブラリと呼び出し元アプリケーションが同じコンパイラを使用して構築されていることを確認することです。

于 2010-10-13T11:07:24.720 に答える