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

  • 相关阅读:
    响应式css样式
    组件 computed 与 vuex 中 getters 的使用,及 mapGetters 的使用,对象上追加属性,合并对象
    nginx 错误集锦
    动态的添加路由
    NProgress的使用 及 路由 token 定向的使用
    token的解码及 判断值不为空的方法
    nginx 的使用
    IT公司100题-tencent-打印所有高度为2的路径
    测试
    Objective-C 与 C++ 的异同
  • 原文地址:https://www.cnblogs.com/yahoo17/p/14308172.html
Copyright © 2020-2023  润新知