ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c – 链接MATLAB Mex库中的错误

2019-07-25 17:04:59  阅读:255  来源: 互联网

标签:mex c matlab macos linker-errors


我正忙着编译一个MATLAB Mex库 – 特别是this website的’Correlation Clustering Optimization’代码.

我试图在OSX机器上编译,并使用提供的mexall函数.这将运行以下行:

mex -O -largeArrayDims CXXFLAGS="\$CXXFLAGS -Wno-write-strings" QPBO.cpp QPBO_extra.cpp QPBO_maxflow.cpp QPBO_wrapper_mex.cpp QPBO_postprocessing.cpp -output QPBO_wrapper_mex

链接时将错误发生在以下输出到MATLAB命令行:

ld: duplicate symbol QPBO<int>::GetMaxEdgeNum()    in QPBO_extra.o and QPBO.o
collect2: ld returned 1 exit status

    mex: link of ' "QPBO_wrapper_mex.mexmaci64"' failed.

从这一点来看,函数GetMaxEdgeNum出现在QPBO_extra.o和QPBO.o中.但是,它实际上只在头文件QPBO.h中定义.因此,我怀疑包含它的两个源文件都将其作为符号包含在其目标文件中,从而导致链接时出现问题.

(更多信息:每个源文件还包含一个文件#include“instances.inc”在文件的最后.sumins.inc显然似乎包含模板化QPBO的一些特定实例.)

我在这里犯了一个明显的错误吗?我该怎么做才能增加编译代码的机会?

编辑

这是QPBO.h中有问题的GetMaxEdgeNum函数的定义:

template <typename REAL> 
    inline int QPBO<REAL>::GetMaxEdgeNum() 
{
    return (int)(arc_max[0]-arcs[0])/2;
}

编辑2

关于我的机器的更多细节:

> OSX 10.6.8
> MATLAB R2012a(也有R2011b)
> g 4.2或g 4.0(或通过MacPorts g 4.6)

我在下面的“赏金描述”中添加了一些关于我真正想要的细节.

编辑3

有一些共识,即instance.inc可能会造成麻烦.这包含在每个cpp文件的末尾,它包含以下内容:

#include "QPBO.h"

#ifdef _MSC_VER
#pragma warning(disable: 4661)
#endif

// Instantiations

template class QPBO<int>;
template class QPBO<float>;
template class QPBO<double>;

template <> 
    inline void QPBO<int>::get_type_information(char*& type_name, char*& type_format)
{
    type_name = "int";
    type_format = "d";
}

template <> 
    inline void QPBO<float>::get_type_information(char*& type_name, char*& type_format)
{
    type_name = "float";
    type_format = "f";
}

template <> 
    inline void QPBO<double>::get_type_information(char*& type_name, char*& type_format)
{
    type_name = "double";
    type_format = "Lf";
}

解决方法:

似乎问题是某些模板代码在.cpp文件中.

>从.cpp文件中删除#include instances.inc声明.
>将所有代码从QPBO.cpp,QPBO_extra.cpp,QPBO_maxflow.cpp和QPBO_postprocessing.cpp移动到头文件qpbo.h.
>您现在将拥有一个.cpp文件qpbo_wrapper_mex.cpp和一个标头qpbo.h
> mex文件(在matlab中)使用:

>> mex -O -largeArrayDims qpbo_wrapper_mex.cpp

应该管用…

标签:mex,c,matlab,macos,linker-errors
来源: https://codeday.me/bug/20190725/1535314.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有