我在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代码,而不是使用自定义扩展来实现目标文件目标?
答案 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)