我正在尝试编写一个图像去模糊的程序。我试着奔跑
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)有什么建议可以解决这个问题吗?谢谢你们所有人。
发布于 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中的含义非常不同。
https://stackoverflow.com/questions/40345220
复制相似问题