Makefile
一般CPP引入第三方库的步骤
- Wget url 下载下来
- tar -zxvf 解压文件 这里z是如果用了gzip 比如文件 tar.gz x是解压的意思 v是显示过程 f后面接要解压的文件
- ./configure --prefix=/usr/... 先配置
- make install 编译安装
- 至此已经弄好了
Makefile编写和代码组织
project
├── deps
│ ├── boost
│ ├── Gtest
│ ├── protobuf-include
│ ├── protobuf-lib
├── project
│ ├── src
│ ├── include
│ └── dep
├── release
│ ├── lib
Makefile详解
include ../Inc.mk
INCLUDE += $(JSON_INC) $(OPENSSL_INC) -I../../include $(RAPID_JSON_INC)
CXXFLAGS += -DNDEBUG -O2 -fvisibility=hidden
OBJS = abc_channel.o abc_config.o
LIBS += $(JSON_LIB) $(OPENSSL_CRYPTO_LIB) -L../common -lchannel_comm
SO_NAME = abc_channel.so
$(SO_NAME) : $(OBJS)
$(CXX) -o $@ $^ -shared -fPIC $(LIBS) -Wl,-z -Wl,defs
install : $(SO_NAME)
$(CP) $(SO_NAME) $(INSTALL_PATH)
clean:
$(RM) *.o $(SO_NAME)
Inc.mk
PUB_LIB_HOME=/data/home/jenkins/lib
#############################################################
PROJ_PATH = /
FRAME_PATH=$(PROJ_PATH)/../
#INSTALL_PATH = $(PROJ_PATH)/build
INSTALL_PATH =/release/lib
############################################################
FRAME_INC_PATH=$(FRAME_PATH)/include
FRAME_INC=-I$(FRAME_INC_PATH)
PROJ_DEP_PATH=$(PROJ_PATH)/dep
BOOST_PATH = $(PUB_LIB_HOME)/boost/boost_1_59_0
BOOST_INC = -I$(BOOST_PATH)
MSGPACK_PATH=$(PUB_LIB_HOME)/msgpack/0.5.7
MSGPACK_INC=-I$(MSGPACK_PATH)/include
MSGPACK_LIB=-L$(MSGPACK_PATH)/lib/Tlinux1.2 -lmsgpack
PROTOBUF_PATH=$(PUB_LIB_HOME)/protobuf/2.4.1
PROTOBUF_INC=-I$(PROTOBUF_PATH)/include
PROTOBUF_LIB=$(PROTOBUF_PATH)/lib/Tlinux1.2/libprotobuf.a
OPENSSL_PATH=$(PUB_LIB_HOME)/openssl/1.0.2a
OPENSSL_INC=-I$(OPENSSL_PATH)/include
OPENSSL_LIB=-L$(OPENSSL_PATH)/lib/Tlinux1.2 -lssl
OPENSSL_CRYPTO_LIB=-L$(OPENSSL_PATH)/lib/Tlinux1.2 -lcrypto
RAPID_JSON_PATH=$(PUB_LIB_HOME)/rapidjson/1.0.1
RAPID_JSON_INC=-I$(RAPID_JSON_PATH)/include
JSON_PATH=$(PUB_LIB_HOME)/libjson/64/7.6.1
JSON_INC=-I$(JSON_PATH)/include
JSON_LIB=-L$(JSON_PATH)/lib/ -ljson
OAUTH_PATH=$(PUB_LIB_HOME)/oauth/0.9.4
OAUTH_INC=-I$(OAUTH_PATH)/include
OAUTH_LIB=-L$(OAUTH_PATH)/lib/Tlinux1.2 -loauth
#####################################################
INCLUDE = -I. $(FRAME_INC) $(MSGPACK_INC)
CXXFLAGS = -Wall -Werror -Wno-unused-function -fPIC -pipe $(INCLUDE)
ifeq ($(BUILD_TYPE), BUILD_DEBUG)
CXXFLAGS += -ggdb3 -DDEBUG
else
CXXFLAGS += -ggdb -O2 -DNDEBUG
endif
CP = cp -f
INSTALL = install -D -p
已经滤除了项目的信息
-
前提include ../Inc.mk 可以include 上一级目录的makefile
-
$(abc) 是变量替换
-
abc = /data/home 是定义一个变量
选项 | 作用 |
---|---|
-c | 生成可目标文件,但不进行链接 |
-o | 指定生成文件的文件名 |
-g | 在目标文件中添加调试信息,便于gdb调试或objdump反汇编 |
-Wall | 显示所有的警告信息(建议使用) |
-Werror | 视警告为错误,出现警告即放弃编译 |
-w | 不显示任何警告信息(不建议使用) |
-v | 显示编译步骤 |
-On | (n=0,1,2,3) 设置编译器优化等级,O0为不优化,O3为最高等级优化,O1为默认优化等级 |
-L | 指定库文件的搜索目录 |
-l | (小写的L)链接某一库 |
-I | (大写的i)指定头文件路径 |
贴几个重要的参数
-L 搜索库的路径
-labc 编译时使用libabc.so 或者libabc.a
-fPIC 使用地址无关代码
-Wall 显示所有的警告信息(建议使用)
CXX 内置变量 Program for compiling C++ programs; default ‘g++’.