我有以下makefile:
VER=cblas
GCC_VERSION = 7.2.0
PREFIX = /usr/local/gcc/${GCC_VERSION}/bin/
CC = ${PREFIX}gcc
CPP = ${PREFIX}g++
w2.${VER}: w2.${VER}.o
$(CPP) -ow2.${VER} w2.${VER}.o
w2.${VER}.o: w2.${VER}.cpp
$(CPP) -c -O2 -std=c++17 w2.${VER}.cpp
clean:
rm *.o
我需要修改这个makefile,使其包含gsl库。我可以使用命令直接编译:
g++ -Wall -I/home/path/gsl/include -c w2.cblas.cpp
g++ -L/home/path/gsl/lib w2.cblas.o -lgsl -lgslcblas -lm
如何修改此makefile以包含gsl库(和c ++ 11)?
答案 0 :(得分:4)
而不是定义自己的规则(即:删除以下内容):
w2.${VER}: w2.${VER}.o
$(CPP) -ow2.${VER} w2.${VER}.o
w2.${VER}.o: w2.${VER}.cpp
$(CPP) -c -O2 -std=c++17 w2.${VER}.cpp
您可以简单地依赖已经定义的隐式规则。 您只需要正确设置这些隐式规则使用的变量。 因此,为了找到编译的头文件:
CPPFLAGS := -I/home/path/gsl/include
对于C ++标准的优化和规范:
CXXFLAGS := -O2 -std=c++11
最后,对于链接:
LDFLAGS := -L/home/path/gsl/lib
LDLIBS := -lgsl -lgslcblas -lm
LD = $(CXX)
请注意,这些规则依赖于CXX
变量来指定编译器,而不是CPP
,因此您不想要:
CPP = ${PREFIX}g++
但:
CXX = ${PREFIX}g++
顺便说一句,make中的CPP
代表 C预处理器(而不是 C ++ ,即CXX
)。< / p>
将上面解释的所有内容放在一起,您的makefile将如下所示:
ER=cblas
GCC_VERSION = 7.2.0
PREFIX = /usr/local/gcc/${GCC_VERSION}/bin/
CC = ${PREFIX}gcc
CXX = ${PREFIX}g++
CPPFLAGS := -I/home/path/gsl/include
CXXFLAGS := -O2 -std=c++11
LDFLAGS := -L/home/path/gsl/lib
LDLIBS := -lgsl -lgslcblas -lm
LD = $(CXX)
clean:
rm *.o
请注意,clean
是上面makefile中唯一的显式规则。
考虑到您有一个名为w2.cblas.cpp
的源文件,那么您应该以这种方式调用make
:
make w2.cblas