Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 编译MEX文件时链接出现问题_C_Matlab_Compiler Errors_Linker_Mex - Fatal编程技术网

C 编译MEX文件时链接出现问题

C 编译MEX文件时链接出现问题,c,matlab,compiler-errors,linker,mex,C,Matlab,Compiler Errors,Linker,Mex,我试图编译一个我编写的mex文件,以便在MATLAB中运行一个预先存在的C程序。我收到以下错误: >> mex src/main.c -Iinclude -I/Users/my_name/mpfr-3.1.1/src/ -I/Users/my_name/gmp-5.0.5 -Lsrc0 -output cpdetect_c Undefined symbols for architecture x86_64: "_binomial_main", referenced from:

我试图编译一个我编写的mex文件,以便在MATLAB中运行一个预先存在的C程序。我收到以下错误:

>> mex src/main.c -Iinclude -I/Users/my_name/mpfr-3.1.1/src/ -I/Users/my_name/gmp-5.0.5 -Lsrc0 -output cpdetect_c
Undefined symbols for architecture x86_64:
  "_binomial_main", referenced from:
      _cpdetect in main.o
  "_gaussian1_main", referenced from:
      _cpdetect in main.o
  "_gaussianU_main", referenced from:
      _cpdetect in main.o
  "_mpfr_clears", referenced from:
      _cpdetect in main.o
  "_mpfr_exp10", referenced from:
      _cpdetect in main.o
  "_mpfr_inits2", referenced from:
      _cpdetect in main.o
  "_mpfr_set_d", referenced from:
      _cpdetect in main.o
  "_poisson_main", referenced from:
      _cpdetect in main.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
Undefined symbols for architecture x86_64:
  "_mpfr_mul_d", referenced from:
      _gaussian1_calc_constant_part in gaussian1.o
      _gaussianU_calc_constant_part in gaussianU.o
  "_mpfr_printf", referenced from:
      _find_gaussian1_change_point in gaussian1.o
      _gaussian1_point_calc in gaussian1.o
      _gaussianU_calc_constant_part in gaussianU.o
      _find_gaussianU_change_point in gaussianU.o
      _find_poisson_change_point in poisson.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status

    mex: link of ' "cpdetect_c.mexmaci64"' failed.
我很困惑,因为这些函数都是我在代码中包含的文件的一部分。如何让编译器找到它们

我正在MacOSX10.8上运行MatlabR2013A,Xcode版本为4.6.3

谢谢你的建议

更新1:

@Shai:我的src0文件夹的内容:

>> ls src0
Makefile            gaussian1.o         test_gaussian1.c        test_tools.c
Makefile.am         loadtraj.c          test_gaussian1_point_calc.c test_tools.o
Makefile.in         loadtraj.o          test_load           tools.c
binomial.c          main.c              test_load.c         tools.o
binomial.o          main.o              test_load.o
cpdetect            poisson.c           test_poisson.c
gaussian1.c         poisson.o           test_tools
这个原本打算在命令行上运行的C程序来自一个朋友,并且已经有了src0文件夹。在编写mex函数时,我修改了“src”文件夹中的代码文件,但没有触及src0文件夹

更新2: 我意识到我指向mpfr的错误位置。我现在使用以下编译命令:

>> mex src/main.c src/binomial.c src/gaussian1.c src/gaussianU.c src/poisson.c -Iinclude -I/usr/local/include -lmpfr -output cpdetect_c
它给出了以下错误:

>> mex src/main.c -Iinclude -I/Users/my_name/mpfr-3.1.1/src/ -I/Users/my_name/gmp-5.0.5 -Lsrc0 -output cpdetect_c
Undefined symbols for architecture x86_64:
  "_binomial_main", referenced from:
      _cpdetect in main.o
  "_gaussian1_main", referenced from:
      _cpdetect in main.o
  "_gaussianU_main", referenced from:
      _cpdetect in main.o
  "_mpfr_clears", referenced from:
      _cpdetect in main.o
  "_mpfr_exp10", referenced from:
      _cpdetect in main.o
  "_mpfr_inits2", referenced from:
      _cpdetect in main.o
  "_mpfr_set_d", referenced from:
      _cpdetect in main.o
  "_poisson_main", referenced from:
      _cpdetect in main.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
Undefined symbols for architecture x86_64:
  "_mpfr_mul_d", referenced from:
      _gaussian1_calc_constant_part in gaussian1.o
      _gaussianU_calc_constant_part in gaussianU.o
  "_mpfr_printf", referenced from:
      _find_gaussian1_change_point in gaussian1.o
      _gaussian1_point_calc in gaussian1.o
      _gaussianU_calc_constant_part in gaussianU.o
      _find_gaussianU_change_point in gaussianU.o
      _find_poisson_change_point in poisson.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status

    mex: link of ' "cpdetect_c.mexmaci64"' failed.

这很奇怪。这并不是说编译器找不到任何mpfr函数——它似乎可以毫不费力地找到许多其他函数,如果我故意省略-lmpfr标志,我会得到更长的未定义符号列表。我确认mpfr_mul_d和mpfr_printf是我安装的mpfr发行版的一部分。有什么想法吗?谢谢。

答案由Amro提供-在本例中,必须使用-L/usr/local/lib标志指向库的位置,并告诉编译器使用-lmpfr标志链接到库。还感谢Shai提供的故障排除帮助。

哪些库编译了“src0”文件夹中的文件?您包含的函数是否编译到共享库中?他们的源代码在哪里?您编译过它们的源代码吗?包含函数的源代码位于子文件夹include中,我在命令行中用“-Iinclude”指向该子文件夹。我需要分别编译它们吗?我认为mex会自动编译任何包含的源代码以及main函数_c@Shai:谢谢,这很有帮助-现在它找到了我所有的源文件,它只是在mpfr功能方面有问题。我如何链接到这些?我尝试将-L/Users/my_name/mpfr-3.1.1/src/添加到上面的命令中,但没有任何帮助。