修改生成文件以包含库并使用 C++11

Modify Makefile to include a library and use C++11

本文关键字:C++11 包含库 文件 修改      更新时间:2023-10-16

我有以下制作文件:

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

我需要修改这个生成文件,使其包含 gsl 库。我能够直接使用以下命令进行编译:

g++ -Wall -I/home/path/gsl/include -c w2.cblas.cpp
g++ -L/home/path/gsl/lib w2.cblas.o -lgsl -lgslcblas -lm

如何修改此生成文件以包含 gsl 库(和 c++11)?

而不是定义自己的规则(即:删除以下内容):

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++

顺便说一下,CPPin make 代表C 预处理器(而不是C++,那将是CXX)。


生成文件

将上面解释的所有内容放在一起,您的生成文件将如下所示:

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是上述生成文件中唯一的显式规则

考虑到您有名为w2.cblas.cpp的源文件,那么您应该以这种方式调用make

make w2.cblas