CPP编译 makefile

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

posted @ 2021-01-21 15:14  Yan_Hao  阅读(413)  评论(0编辑  收藏  举报