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) 之间一定存在一些调用约定问题。这个问题特别难以发现,因为我的一个库 (ButterOneLp) 运行良好,即使它是使用 Lcc 生成的。但是,另一个库不起作用。

该问题已通过使用

mex -setup

. . . MATLAB 中的命令并将默认编译器更改为 MSVC,而不是默认 Lcc。

我认为 Lcc 基于 gcc,所以如果有人知道如何更改 C++ 代码中的调用约定以便可以从 MSVC 调用 gcc/lcc 库,那就太好了。但是,这与发布的原始问题完全不同。

这个故事的寓意是如果您收到“致命错误 LNK1127:库已损坏”,请检查您的库和调用应用程序是否使用相同的编译器构建。

于 2010-10-13T11:07:24.720 回答