我正在尝试编译一个用于图像去模糊的程序。 我试着跑
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)
有什么建议可以解决这个问题吗? 谢谢大家。
答案 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)在程序中的其他位置提供外部(非内联)添加定义。这两个定义必须是等价的! p>
4)通过将-std = gnu89添加到Clang选项集来编译GNU C89方言。仅在程序源中建议使用此选项 无法更改,或者该程序还依赖于额外的 C89特定的行为无法更改。
所有这些仅适用于C代码; C ++中inline的含义是 与GNU89或C99中的含义截然不同。