2016-10-31 3 views
1

Я пытаюсь скомпилировать программу для удаления изображения. я пытаюсь запуститьОшибка Matlab компиляции файлов C с помощью 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); 
... 
} 

Проблема заключается в функции compute_homography_matrix, которая находится в другом файле ow_homography.h

#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

функции, описанная в вашей ошибке электронного письма с префиксом подчеркиванием в то время как код в вашем примере не – chiliNUT

+0

НКУ имеют приятный '-fleading-underscore' принуждать подчеркивания на символах. Не знаю о лягу. –

ответ

0

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

C совместимость C99 встроенные функции

По умолчанию Clang строит код C в режиме GNU С11, поэтому он использует стандартные C99 семантику для строкового ключевого слова. Эти семантики отличаются от от режимов в режиме GNU C89, который является режимом по умолчанию в версиях GCC до 5.0. Например, рассмотрим следующий код:

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

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

В C99, рядный означает, что определение функции во предусмотрен только для встраивание, и что есть другое определение (без встроенного) где-то в программе. Это означает, что эта программа не заполнена , потому что если добавление не включено (например, при компиляции без оптимизации), то у основного будет нерешенная ссылка на , что и другое определение. Поэтому мы получим (правильный) ссылку ошибка времени так:

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

В отличие от режима GNU C89 (используется по умолчанию в более ранних версиях GCC) является стандартом C89 плюс много расширений , C89 не имеет ключевого слова inline , но GCC распознает его как расширение и просто обрабатывает как подсказку оптимизатору.

Есть несколько способов исправить эту проблему:

1) Изменить добавить к статической функции инлайн. Это, как правило, правильное решение, если только одна единица перевода должна использовать эту функцию. статические встроенные функции всегда разрешаются в пределах блока перевода , поэтому вам не нужно добавлять нестрочное определение функции в другое место в вашей программе.

2) Измените ключевое слово inline из этого определения add.Ключевое слово inline не требуется для встроенной функции, равно как и не должно быть . Некоторые компиляторы полностью игнорируют его. Clang относится к нему как к мягкому предложению программиста.

3) Предоставьте внешнее (не встроенное) определение добавления где-то еще в вашей программе. Эти два определения должны быть эквивалентными!

4) Скомпилируйте диалект GNU C89, добавив -std = gnu89 в набор параметров Clang. Эта опция рекомендуется только в том случае, если исходный код не может быть изменен или если программа также полагается на дополнительное поведение, отличное от C12, которое не может быть изменено.

Все это относится только к коду C; значение inline в C++ - , сильно отличающееся от его значения в GNU89 или C99.

Смежные вопросы