gpt4 book ai didi

c++ - 链接来自 MATLAB Mex 库的错误

转载 作者:太空狗 更新时间:2023-10-29 20:05:06 24 4
gpt4 key购买 nike

我在编译 MATLAB Mex 库时遇到麻烦 - 具体来说,来自 this website 的“相关聚类优化”代码.

我正在尝试在 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.oQPBO.o中。然而,它实际上只在头文件 QPBO.h 中定义。因此,我怀疑包含它的两个源文件都将它作为一个符号包含在它们的目标文件中,从而导致链接时出现问题。

(更多信息:每个源文件还在文件的末尾包含一个文件#include "instances.inc"instances.inc 显然似乎包括模板化 QPBO 的一些特定实例。)

我在这里犯了一个明显的错误吗?我可以做些什么来增加编译此代码的机会?

编辑

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

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

编辑 2

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

  • 操作系统 10.6.8
  • MATLAB R2012a(还有R2011b)
  • g++ 4.2 或 g++ 4.0(或通过 MacPorts 的 g++ 4.6)

我在下面的“赏金描述”中添加了一些关于我真正想要的答案的详细信息。

编辑 3

有一些共识认为 instances.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 文件中。

  1. .cpp 文件中删除 #include instances.inc 声明。
  2. 移动QPBO.cppQPBO_extra.cppQPBO_maxflow.cppQPBO_postprocessing.cpp 中的所有代码到头文件qpbo.h
  3. 您现在将拥有一个 .cpp 文件 qpbo_wrapper_mex.cpp 和一个 header qpbo.h
  4. mex 文件(在 matlab 中)使用:

    >> mex -O -largeArrayDims qpbo_wrapper_mex.cpp

应该工作...

关于c++ - 链接来自 MATLAB Mex 库的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15298603/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com