【问题标题】:Makefile to create an executable .mexa64 file from matlabMakefile 从 matlab 创建一个可执行的 .mexa64 文件
【发布时间】: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 链接”...

标签: c matlab gcc makefile


【解决方案1】:

“可执行” .mexa64 文件的含义有点不清楚。

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

  2. 但是,如果您想在 MATLAB 之外拥有一个独立的“可执行文件”,则需要使用 MATLAB 的 mcr 编译器(请参阅reference here)。您可以在此过程中设置一些标志来构建一个目标文件,然后您可以稍后将其与您的 makefile 链接,就像您现在尝试的那样。

因此,请勿将可在 MATLAB 中运行的 mex 编译文件与可在 MATLAB 之外执行的 mcr 编译代码混合使用。

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

【讨论】:

  • 感谢您的回复。我需要 1 号。main() 函数应该由 mexFunction() 代替。所以根本不应该有 main() 函数。所以 mexFunction() 具有 main() 函数的功能。
  • 如果您需要 1 号,那么您不是已经可以使用了吗?您将在 MATLAB 中使用“mex”,而不是 gcc。
  • 您说,“代码在命令窗口中运行良好,但如果我尝试使其从 matlab(.mexa64 文件)可执行,则无法运行。”我理解这意味着你可以让它在 MATLAB 命令窗口中工作(因为你是从 mex 编译的),但第二部分是你说的(a)你不能让它在 MATLAB 中执行(与你刚才所说的相反说)或(b)您无法从 MATLAB 构建可执行文件(与您尝试使用 makefile 和 gcc 所做的相反)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-03
  • 1970-01-01
  • 1970-01-01
  • 2013-03-12
相关资源
最近更新 更多