用mex

时间:2016-10-31 15:21:37

标签: c matlab x86-64 mex

我正在尝试编译一个用于图像去模糊的程序。 我试着跑

mex apply_blur_kernel_mex.c

其中文件apply_blur_kernel_mex.c具有以下代码

#include <mex.h>
#include <stdlib.h>
#include <math.h>
#include <matrix.h>
#include "ow_homography.h"
...
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
...
compute_homography_matrix(Ksharp, &theta_list[k*3], invKblurry, H);
...
}

问题在于另一个文件ow_homography.h中的compute_homography_matrix函数

#ifndef OW_HOMOGRAPHY_H
#define OW_HOMOGRAPHY_H

#include "ow_mat3.h"

INLINE void compute_homography_matrix(const double *Ksharp, const double *theta, const double *invKblurry, double *H) {
    double R[9];
    /* Compute homography */
    cp3(invKblurry,H);
    rot3(theta[0],theta[1],theta[2],R);
    mmip3(R,H);
   mmip3(Ksharp,H);
}

最后一个操作(cp3,rot3 ...)位于另一个文件ow_mat3.h中,该文件包含程序的所有操作。 所以当我试着打电话时

mex apply_blur_kernel_mex.c

我有以下问题:

Error using mex
Undefined symbols for architecture x86_64:
    "_compute_homography_matrix", referenced from: 
       mexFunction in apply_blur_kernel_mex.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

有什么建议可以解决这个问题吗? 谢谢大家。

1 个答案:

答案 0 :(得分:0)

http://clang.llvm.org/compatibility.html#inline

  

C兼容性C99内联函数

     

默认情况下,Clang在GNU C11模式下构建C代码,因此它使用标准   内联关键字的C99语义。这些语义是不同的   来自GNU C89模式的那些,这是版本中的默认模式   海湾合作委员会5.0之前。例如,请考虑以下代码:

inline int add(int i, int j) { return i + j; }

int main() {   int i = add(4, 5);   return i; }
     

在C99中,内联意味着仅提供函数的定义   内联,还有另一个定义(没有内联)   程序中的其他地方。这意味着这个程序是   不完整,因为如果添加不是内联的(例如,编译时)   没有优化),那么main将有一个未解析的引用   其他定义。因此,我们会得到(正确的)链接时错误   像这样:

Undefined symbols:   "_add", referenced from:
      _main in cc-y1jXIr.o
     

相比之下,GNU C89模式(默认情况下在旧版本的GCC中使用)   是C89标准加上很多扩展。 C89没有   内联关键字,但GCC将其视为一个扩展,只是对待   它作为优化器的提示。

     

有几种方法可以解决此问题:

     

1)更改添加到静态内联函数。如果只有一个翻译单元需要使用该功能,这通常是正确的解决方案。   静态内联函数始终在转换中解析   单位,所以你不必添加函数的非内联定义   你节目中的其他地方。

     

2)从add的这个定义中删除inline关键字。内联函数不需要inline关键字,也不需要   保证它会。有些编译器完全忽略它。铛   将其视为程序员的温和建议。

     

3)在程序中的其他位置提供外部(非内联)添加定义。这两个定义必须是等价的!      

4)通过将-std = gnu89添加到Clang选项集来编译GNU C89方言。仅在程序源中建议使用此选项   无法更改,或者该程序还依赖于额外的   C89特定的行为无法更改。

     

所有这些仅适用于C代码; C ++中inline的含义是   与GNU89或C99中的含义截然不同。