c - 用于从 matlab 创建可执行 .mexa64 文件的生成文件



我尝试编写一个makefile来创建可执行的.mexa64文件。我必须使用 gcc 编译器。我当前的工作文件夹如下所示:

FFTW_build.c
FFTW_func.c 
Makefile.c  
obj (Folder, here are my object files *.o which are created)

源代码FFTW_build.c:

#include "mex.h"
void mexFunction(int nlhs, mxArray *plhs[],  int nrhs, const mxArray *prhs[])
{
FFTW_perform();
return;
}

源代码FFTW_func.c:

#include <math.h>
#include <stdio.h>
#include <complex.h>
#include <fftw3.h>
#include "mex.h"

void FFTW_perform() {
int i;
int Npoints=10;
fftw_complex *in, *out;
fftw_plan plan;
in = (fftw_complex*) fftw_malloc(sizeof(fftw_complex)*Npoints);
out = (fftw_complex*) fftw_malloc(sizeof(fftw_complex)*Npoints);
plan = fftw_plan_dft_1d(Npoints, in, out, FFTW_FORWARD, FFTW_ESTIMATE);
mexPrintf("nCoefficcients of the expansion:nn");
for(i = 0; i < Npoints; i++)
{
in[i] = (i+1)+(3*i-1)*I;
mexPrintf("%d %11.7f %11.7fn", i, creal(in[i]), cimag(in[i]));
}
mexPrintf("n");
fftw_execute(plan); 
mexPrintf("Output:nn");
for(i = 0; i < Npoints; i++)
{
mexPrintf("%d %11.7f %11.7fn", i, creal(out[i]), cimag(out[i]));
}
}

Makefile.c的源代码:

##################    Compiler    ##################
CXX = gcc 
####################################################
##################    MEXSUFFIX  ################
MEXSUFFIX  = mexa64  
####################################################
##################   Home of my matlab version #####
MATLABHOME = /home/tuebel/matlab
####################################################

##################    Object_File_Declaration_Folder    ################
OBJS_MEX       = FFTW_build.o
OBJS_FFTW_FUNC = FFTW_func.o 
ODIR=obj
_OBJ = $(OBJS_MEX) $(OBJS_FFTW_FUNC)
OBJ  = $(patsubst %,$(ODIR)/%,$(_OBJ))

####################################################
##################    Header_Files    ################

# Header for mex 
DIR_MEX_HEADER = /home/tuebel/matlab/extern/include
_DEPS_MEX = mex.h
DEPS_MEX  = $(patsubst %,$(DIR_MEX_HEADER)/%,$(_DEPS_MEX))

# Header for fftw3
DIR_FFTW_HEADER = /usr/local/include
_DEPS_FFTW = fftw3.h
DEPS_FFTW  = $(patsubst %,$(DIR_FFTW_HEADER)/%,$(_DEPS_FFTW))

####################################################

##################    Library_Files    ################
# Libraries for mex
MEX_LIB  = /home/tuebel/matlab/bin/glnxa64/libmex.so   
# Libraries for FFTW
FFTW_LIB = /usr/local/lib/libfftw3.a
# Libraries for math_function
MATH_LIB = -lm 

####################################################
##################    Flags    ################
# MEXFLAGS         = -shared -Wl,--no-undefined -Wl,-rpath-link,$(MATLABHOME)/bin/glnxa64 -L$(MATLABHOME)/bin/glnxa64 -lmex -lmat -lmx -lm
MEXFLAGS         =  -shared -Wl,-rpath-link,$(MATLABHOME)/bin/glnxa64 -L$(MATLABHOME)/bin/glnxa64 -lmex -lmat -lmx -lm
COMPILERFLAGS    =  -fPIC -pthread -DMATLAB_MEX_FILE -ansi -D_GNU_SOURCE -fno-omit-frame-pointer -O3 -DNDEBUG
FFTW_FLAGS_INCLUDE     = -I$(DIR_FFTW_HEADER)
MEX_FLAGS_INCLUDE      = -I$(DIR_MEX_HEADER)
####################################################
####################  Final_Part   ######################
TARGET = FFTW_MEX
all: $(TARGET) 
echo ALL DONE
clean: 
rm -f $(ODIR)/*.o 
rm -f $(TARGET).mexa64
echo CLEAN DONE

$(ODIR)/%.o: %.c $(DEPS_MEX) $(DEPS_FFTW)
$(CXX) -c -o $@ $<  $(COMPILERFLAGS) $(MEX_FLAGS_INCLUDE) $(FFTW_FLAGS_INCLUDE)     
# Final_Linking
$(TARGET) : $(OBJ)  $(MATH_LIB) $(FFTW_LIB) 
$(CXX) -o $@.$(MEXSUFFIX) $(MEX_FLAGS_INCLUDE) $(FFTW_FLAGS_INCLUDE) $^ $(MEXFLAGS) 

####################################################
####################################################
####################################################

这个想法是使用 fftw3 制作 FFTW。代码在命令窗口中工作正常,但是如果我尝试从matlab(.mexa64文件)使其可执行,则无法正常工作。我使用 make 收到以下错误消息:

gcc  -c -o obj/FFTW_build.o FFTW_build.c  -fPIC -pthread -DMATLAB_MEX_FILE -ansi -D_GNU_SOURCE -fno-omit-frame-pointer -O3 -DNDEBUG -I/home/tuebel/matlab/extern/include -I/usr/local/include 
gcc  -c -o obj/FFTW_func.o FFTW_func.c  -fPIC -pthread -DMATLAB_MEX_FILE -ansi -D_GNU_SOURCE -fno-omit-frame-pointer -O3 -DNDEBUG -I/home/tuebel/matlab/extern/include -I/usr/local/include 
gcc  -o FFTW_MEX.mexa64   -I/home/tuebel/matlab/extern/include -I/usr/local/include obj/FFTW_build.o obj/FFTW_func.o /usr/lib64/libm.so /usr/local/lib/libfftw3.a -shared -Wl,-rpath-link,/home/tuebel/matlab/bin/glnxa64 -L/home/tuebel/matlab/bin/glnxa64 -lmex -lmat -lmx -lm 
/usr/lib64/gcc/x86_64-suse-linux/4.8/../../../../x86_64-suse-linux/bin/ld: /usr/local/lib/libfftw3.a(lt4-problem.o): relocation R_X86_64_32 against `.rodata.str1.1' can not be used when making a shared object; recompile with -fPIC
/usr/local/lib/libfftw3.a: error adding symbols: Bad value
collect2: error: ld returned 1 exit status
Makefile:92: recipe for target 'FFTW_MEX' failed
make: *** [FFTW_MEX] Error 1

有人可以帮助我吗?这是我的第一个制作文件,我很乐意提供任何帮助......我也很高兴对制作文件的更正...

多谢!

有点不清楚"可执行".mexa64 文件是什么意思。

MATLAB 的 mex
  1. 编译器可让您使用 MATLAB 库将 C/C++ 代码编译成一个 mex 文件(此处为您提供 64 位架构),然后您可以通过 MATLAB 的命令行"执行"。 这似乎是你已经开始工作的东西了。

  2. 但是,如果你想在MATLAB之外有一个独立的"可执行文件",你需要使用MATLAB的mcr编译器(参见这里的参考)。 您可以在过程中设置一些标志来构建一个对象文件,然后您可以像现在尝试的那样与 makefile 链接该标志。

因此,不要混合在 MATLAB 中可运行的 mex 编译文件和在其外部可执行的 mcr 编译代码。

除此之外,gcc 抱怨没有 main() 函数。 我在这里的代码中也没有看到一个,但是您需要一个用于独立可执行文件的main()函数。

最新更新