【问题标题】:fatal error LNK1127: library is corrupt --> after adding extern "C" to function prototype致命错误 LNK1127:库已损坏 --> 将 extern "C" 添加到函数原型后
【发布时间】:2011-04-24 05:40:51
【问题描述】:

我有一个使用 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

我已经多次重建库,并且非常确定它没有损坏。任何帮助都会很棒。谢谢!!

【问题讨论】:

  • 您需要确保butterThreeBp 的实现看到extern "C" 声明。确保您#include 相关的头文件并始终注意编译器警告。
  • 奇怪的是,我在使用另一个使用非常相似的方法构建的库时没有遇到任何问题。我使用了这里建议的 -extern "C"- 代码stackoverflow.com/questions/3877129/… 并且一切正常。出于某种原因,这不是。
  • @Paul R:butterThreeBp implementation 编译为 C,extern "C" 仅在 C++ 代码中有效。
  • @Clifford: true 如果 butterThreeBp 被编译为 C,但它可能在一个 .cpp 文件中,在这种情况下它仍然可以使用 C 链接使用 extern "C" 编译。

标签: c++ visual-c++ linker unresolved-external


【解决方案1】:

您不必在 MATLAB 中使用随附的 LCC 编译器。最简单的解决方案是让 MATLAB 使用 VC++。 http://www.mathworks.com/support/compilers/R2010b/index.html

【讨论】:

  • Exactomondo Clifford。请参阅我之前帖子的编辑。我意识到我忘记了明确地编写解决方案。感谢您的帮助!
  • 该错误仍然有些隐蔽,因为它会导致某些库而不是其他库出现错误。我的问题解决了,但我仍然好奇为什么错误不是全有或全无。
【解决方案2】:

知道了!我使用 MATLAB 嵌入式编码器生成了库代码,并使用 Matlab 的内置编译器 Lcc 来构建库。我正在研究 MSVC 中的主应用程序,因此我想在库 (Lcc) 和我的主项目 (MSVC) 之间一定存在一些调用约定问题。这个问题特别难以发现,因为我的一个库 (ButterOneLp) 运行良好,即使它是使用 Lcc 生成的。但是,另一个库不起作用。

问题已通过使用修复

mex -setup

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

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

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

【讨论】:

  • 调用约定可能不是问题(实际上给出了错误 - 不太可能)。我怀疑 LCC 库是一种完全不同的格式,而且它包含的目标文件可能是 ELF 而不是 COFF。
【解决方案3】:

IIRC 只有在使用 C++ 编译器编译时才应添加 extern "C"。

类似的东西:

#ifdef __cplusplus
extern "C" {
#endif

// the declarations

#ifdef __cplusplus
}
#endif  

【讨论】:

  • 啊,现在这很有用。现在我可以将我的 C 库的头文件包装在 extern "C" { 构造中,而无需直接修改头文件的源代码(将 extern "C" 代码位放在每个函数声明的开头)。如果有人通过谷歌搜索来到这里,这是获取更多信息的好链接parashift.com/c++-faq-lite/mixing-c-and-cpp.html#faq-32.3 但是,这仍然不能缓解报告的错误消息。
猜你喜欢
  • 2014-01-11
  • 2012-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多