代码之家  ›  专栏  ›  技术社区  ›  learnvst

严重错误LNK1127:向函数原型添加extern“c”后,库已损坏---.

  •  1
  • learnvst  · 技术社区  · 14 年前

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

    我已经重建了图书馆很多次,我很确定它没有腐败。任何帮助都会很好。谢谢!!

    3 回复  |  直到 14 年前
        1
  •  2
  •   Clifford    14 年前

    您不必在Matlab中使用包含的LCC编译器。最简单的解决方案是让matlab使用vc++。 http://www.mathworks.com/support/compilers/R2010b/index.html

        2
  •  1
  •   user283145    14 年前

    IIRC只需在C++编译器编译时添加外部“C”。

    就像这样:

    #ifdef __cplusplus
    extern "C" {
    #endif
    
    // the declarations
    
    #ifdef __cplusplus
    }
    #endif  
    
        3
  •  0
  •   learnvst    14 年前

    知道了!我使用matlab嵌入式编码器生成了库代码,并使用matlab的lcc内置编译器构建了库。我正在研究MSVC中的主要应用程序,因此我猜在库(lcc)和我的主要项目(msvc)之间一定存在一些调用约定问题。这个问题特别难以发现,因为我的一个库(Butteronelp)工作得很好,即使它是使用LCC生成的。然而,另一个图书馆却不起作用。

    通过使用

    mex -setup
    

    . …在matlab中使用命令,并将默认编译器更改为msvc,而不是默认的lcc。

    我认为LCC是基于GCC的,所以如果有人知道如何改变C++代码中的调用约定,以便可以从MSVC调用GCC/LCC库,那就太好了。然而,这是一个完全不同于原版的问题。

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