【发布时间】:2017-06-07 14:21:31
【问题描述】:
我尝试编写一个 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:\n\n");
for(i = 0; i < Npoints; i++)
{
in[i] = (i+1)+(3*i-1)*I;
mexPrintf("%d %11.7f %11.7f\n", i, creal(in[i]), cimag(in[i]));
}
mexPrintf("\n");
fftw_execute(plan);
mexPrintf("Output:\n\n");
for(i = 0; i < Npoints; i++)
{
mexPrintf("%d %11.7f %11.7f\n", 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
有人可以帮帮我吗?这是我的第一个 Makefile,我会很高兴得到任何帮助...我也很高兴对 Makefile 进行更正...
非常感谢!
【问题讨论】:
-
对于初学者,Makefile 没有
.c扩展名。然后,您的$@被错误放置在您的“最终链接”规则中,它属于-o之后(它是输出) -
非常感谢!...
-
现在,我稍微更改了我的代码,我得到了发布的错误......我该如何解决这个问题?
-
我对matlab一无所知,也许可以在那里找到一些关于究竟是什么“mexa64”文件是的文档?也许它是一个共享对象,只需将
-shared添加到链接阶段就可以了,但我真的很怀疑,你可能需要一些“特殊的 matlab 链接”...