修改Makefile以包含库并使用C ++ 11

时间:2018-02-03 16:21:47

标签: c++ makefile linker g++

我有以下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)?

1 个答案:

答案 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