如何使用mexsh将非.o目标文件链接到mex可执行文件?

时间:2015-10-27 16:04:29

标签: matlab gcc makefile g++ mex

我在Ubuntu 14.04上使用MATLAB 2015b,使用GCC 4.8.4。

我试图在一个Makefile中管理C和C ++代码。

C和C ++代码需要使用不同的编译器标志。为了解决这个问题,我试图将.cpp文件编译为.xo目标文件和.c文件到.o目标文件,这样我就可以分别使用.xo和.o的不同配方。

这是我的Makefile示例:

CC=gcc
CXX=g++
MEX=/usr/local/MATLAB/R2015b/bin/mexsh

CFLAGS=-Wall -fPIC -std=gnu99
CXXFLAGS=-Wall -fPIC -std=gnu++11

INCLUDES=/usr/include/boost

LFLAGS=-lm -L/usr/lib -lboost_system -lboost_regex
all: hello asio

hello: hello.o               # hello world example, C code, works fine
    $(CC) -o $@ $^ $(LFLAGS)
asio:asio.xo                 # boost asio example, C++ code, works file
    $(CXX) -o $@ $^ $(LFLAGS)
mexAsio:asio.xo
    $(MEX) $^ $(LFLAGS) ############  here, with .xo files as input
                        ############  mex gives "no input file" error
clean:
    rm -f *.o
    rm -f *.xo

%.o: %.c 
    $(CC) -c -o $@ $< $(CFLAGS) -I$(INCLUDES)
%.xo: %.cpp 
    $(CXX) -c -o $@ $< $(CXXFLAGS) -I$(INCLUDES)

GCC和G ++链接具有任意扩展名的目标文件没有问题,但是当我尝试使用mex链接目标文件来创建mex可执行文件时,mex命令只接受.o文件。

问题:

1)有没有办法让mex接受具有任意extesnion的目标文件?

2)是否有另一种方法可以使用不同的编译器标志编译C ++和C代码,而不是使用自定义扩展来实现目标文件目标?

1 个答案:

答案 0 :(得分:1)

  

1)有没有办法让mex接受具有任意扩展名的对象文件?

不,mex是其他编译器的包装脚本,不接受对象文件的任意扩展。

  

2)是否有另一种方法可以使用不同的编译器标志编译C ++和C代码,而不是使用自定义扩展来实现目标文件目标?

你已经在做这个了

%.o: %.c 
    $(CC) -c -o $@ $< $(CFLAGS) -I$(INCLUDES)
%.xo: %.cpp 
    $(CXX) -c -o $@ $< $(CXXFLAGS) -I$(INCLUDES)

我只想在Makefile中更改以下内容:

  • %.xo: %.cpp - &gt; %.o: %.cpp
  • asio:asio.xo - &gt; asio:asio.o
  • mexAsio:asio.xo - &gt; mexAsio:asio.o

您可能需要将$(MEX) $^ $(LFLAGS)更改为$(MEX) -cxx $^ $(LFLAGS)