# 目标文件名
TARGET := libMyMath.so
# 生成的目标所放置的位置
TARGET_PATH :=../
# 编译参数
CC := g++
# 依赖库名称,如:LIBS=-lpthread
LIBS :=
# 指定依赖库位置,多个引用库之间以空格分开, 如: LDFLAGS=-L/usr/lib -L/xxx/lib
LDFLAGS :=
# 向代码提供宏定义, 一般代码这样使用:
# #ifdef XXXX
# ...
# #endif
# 宏定义有2种方式: (1) -D DEFINE1 (2) -D DEFINE2=1000
# 多个宏定义以空格分开, 如: DEFINES=-DGT60 -DISANDROID=1
DEFINES :=
# 依赖头文件路径(当前路径: I.), 多个路径以空格分开, 如: INCLUDES=-I/usr/include -I/path/include
INCLUDES := -I.
# -O0:表示编译时没有优化
# -O1:表示编译时使用默认优化
# -O2:表示编译时使用二级优化
# -O3:表示编译时使用最高级优化
# -Os: 优化代码大小,其使能了-O2的所有选项,相当于-O2.5
CFLAGS := -g -Wall -O3 -std=c++11 $(DEFINES) $(INCLUDES)
CXXFLAGS:= $(CFLAGS)
# VPATH告诉编译器当前目录和指定目录都按照当前规则编译
VPATH = . ./subdir
# 自动查找所有.c和.cpp文件,并将目标定义为同名.o文件
# wildcard得到当前目录(./)和其子目录下的所有后缀为.cpp文件
# 如果还有目录则再增加一个wildcard, 比如当前目录下还有一个子目录XXX,如: SOURCE := $(wildcard *.cpp) $(wildcard XXX/*.cpp)
SOURCE := $(wildcard *.cpp) $(wildcard subdir/*.cpp)
# notdir去除路径得到文件名
SRC_WITHOUTDIR:= $(notdir $(SOURCE))
# patsubst把.c及.cpp替换成同名.o, 如果手动写.o则不需要SOURCE, 如: OBJS = MyMath.o TestLib.o
OBJS := $(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(SRC_WITHOUTDIR)))
# 显示SOURCE, SRC_WITHOUTDIR, OBJS的值
#OUT:
# @echo $(SOURCE)
# @echo $(SRC_WITHOUTDIR)
# @echo $(OBJS)
# -shared: 编译成动态库
$(TARGET) : $(OBJS)
$(CC) -shared -o $@ $(OBJS) $(LDFLAGS) $(INCLUDES)
ifeq ($(TARGET_PATH),)
# 如果未设置目标路径则不拷贝(目标所在路径为当前目录)
else
# 把.so文件拷贝到指定目录种
cp $(TARGET) $(TARGET_PATH)
endif
%.o : %.cpp
# -fPIC: 告诉编译器产生与位置无关代码(Position-Independent Code)
$(CC) $(CXXFLAGS) -fpic -c $< -o $@ $(LDFLAGS) $(LIBS)
.PHONY : clean
clean:
rm -f *.o
rm -f $(TARGET)
Linux编译.so模板
最新推荐文章于 2024-08-21 08:30:00 发布