makefile 文件的创建需要很多的文件和动态库链接的情况下,本人自己尝试写的一点东西,编译生成一个动态库,做了一点总结:
*******(简单的不做解释)*******
//目录下的的所有。cpp文件(有一些个别的在你的目录中不需要的可以删除)
SRCS :=$(wildcard *.cpp)
//目标(要生成的文件名,我需要的是这个名字,自行调整,一定是 lib 开头 .so 结尾,因为我要用的是动态库)
TARGET := libHxDecMsg.so
//编译包含的头文件所在目录 (必须 -I 带引用到的头文件目录)
INCLUDES := -I. -I /usr/local/jdk1.6/include/ 。。。。。。 -I /home/www/openssl-1.0.2h/include/ -I /usr/lib64/
//这里我引用的库 原名是 libssl.a libcrypto.a 和 libjsoncpp.a 这三个库,多的可以自行按照模式增加
CLIBS := -L /usr/local/ssl/lib/ -lssl -lcrypto -L /usr/local/lib64/ -ljsoncpp
//把源文件SRCS字符串的后缀.cpp 生成 .o 文件,由于SRCS有个别包含详细地址的,生成的.o文件也是详细地址
OBJS :=$(patsubst %cpp, %o, $(SRCS))
最关键是编译命令行的内容,基本可以直接套用(小编我也是躺在命令上好久的)命令行之前是 Tab 键,必须是,不解释
Makefile有三个非常有用的变量。分别是$@,$^,$<代表的意义分别是:
$@--目标文件,$^--所有的依赖文件,$<--第一个依赖文件。
下面我的具体代码是这样的:
VPATH := math:.
CC := g++
CFLAGS :=-Wall -std=c++11 -O2 -shared -fPIC
TARGET := libHxDecMsg.so
INCLUDES:=-I. -I. -I /usr/local/jdk1.6/include/ -I /usr/local/jdk1.6/include/linux/ -I /usr/local/ssl/include/ -I /home/www/openssl-1.0.2h/include/ -I /usr/lib64/
CLIBS := -L /usr/local/ssl/lib/ -lssl -lcrypto -L /usr/local/lib64/ -ljsoncpp
SRCS :=$(wildcard *.cpp)
OBJS :=$(patsubst %cpp, %o, $(SRCS))
all : $(TARGET)
$(TARGET): $(OBJS)
$(CC) $(CFLAGS) $(OBJS) -o $@ $(CLIBS)
%.o:%.cpp
$(CC) -c -pthread $(INCLUDES) $(CFLAGS) $^ -o $@
clean:
rm -rf *.o $(TARGET) $(OBJS)
好的,下面顺带附上我的 gcc编译的原文:
g++ -Wall -std=c++11 -pthread -shared -fPIC -I /usr/local/jdk1.6/include/ -I /usr/local/jdk1.6/include/linux/ -I /usr/local/ssl/include/ -I /home/www/openssl-1.0.2h/include/ -I /usr/local/src/hxdec/jni_20181008/ HxDecMsg_JNI.cpp icinfo_file.cpp icinfo_decrypt.cpp icinfo_header.cpp sm4.cpp DeBase64.cpp HxSm2Encrypt.cpp HxCertificate.cpp HxParam.cpp IParamIn.cpp -L /usr/local/ssl/lib/ -lssl -lcrypto -L /usr/local/lib64/ -ljsoncpp -o libHxDecMsg.so