首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Matlab在使用mex编译C文件时出错

Matlab在使用mex编译C文件时出错
EN

Stack Overflow用户
提问于 2016-10-31 23:21:37
回答 1查看 168关注 0票数 1

我正在尝试编写一个图像去模糊的程序。我试着奔跑

代码语言:javascript
复制
mex apply_blur_kernel_mex.c

其中,文件apply_blur_kernel_mex.c包含以下代码

代码语言:javascript
复制
#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中

代码语言:javascript
复制
#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中,该文件包含程序的所有操作。所以当我试着打电话给

代码语言:javascript
复制
mex apply_blur_kernel_mex.c

我有以下问题:

代码语言:javascript
复制
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)

有什么建议可以解决这个问题吗?谢谢你们所有人。

EN

回答 1

Stack Overflow用户

发布于 2016-10-31 23:49:34

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

C compatibility C99内联函数

默认情况下,Clang以GNU模式构建C代码,因此它对C11关键字使用标准的C99语义。这些语义与GNU C89模式不同,GNU5.0之前的版本默认使用GNU模式。例如,考虑以下代码:

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

在C99中,内联意味着函数的定义仅用于内联,并且程序中的其他地方有另一个定义(没有内联)。这意味着这个程序是不完整的,因为如果add没有内联(例如,在没有优化的情况下编译),那么main将有一个未解析的对另一个定义的引用。因此,我们将得到一个(正确的)链接时间错误,如下所示:

未定义符号:"_add",引用自: cc-y1jXIr.o中的_main

相比之下,GNU C89模式(在较早的GCC版本中默认使用)是C89标准,外加许多扩展。C89没有内联关键字,但GCC将其识别为扩展,并将其视为对优化器的提示。

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

1)将add更改为静态内联函数。如果只有一个翻译单元需要使用该函数,这通常是正确的解决方案。静态内联函数总是在翻译单元中解析,因此您不必在程序中的其他地方添加函数的非内联定义。

2)从add的这个定义中删除inline关键字。inline关键字不是内联函数所必需的,也不能保证它一定会内联。一些编译器完全忽略了它。Clang认为这是程序员的一个温和建议。

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

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

所有这些只适用于C代码;C++中内联的含义与它在GNU89或C99中的含义非常不同。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40345220

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档