zoukankan      html  css  js  c++  java
  • 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++’.

  • 相关阅读:
    Eclipse 导入项目乱码问题(中文乱码)
    sql中视图视图的作用
    Java基础-super关键字与this关键字
    Android LayoutInflater.inflate(int resource, ViewGroup root, boolean attachToRoot)的参数理解
    Android View和ViewGroup
    工厂方法模式(java 设计模式)
    设计模式(java) 单例模式 单例类
    eclipse乱码解决方法
    No resource found that matches the given name 'Theme.AppCompat.Light 的完美解决方案
    【转】使用 Eclipse 调试 Java 程序的 10 个技巧
  • 原文地址:https://www.cnblogs.com/yahoo17/p/14308172.html
Copyright © 2011-2022 走看看