zoukankan      html  css  js  c++  java
  • make编译

    在linux上编译程序,确实是一个苦差事。平时一般用Cmake编译项目。cmake.&&make

    1)首先看下陈皓写的跟我一起写makefile

    http://wiki.ubuntu.org.cn/index.php?title=%E8%B7%9F%E6%88%91%E4%B8%80%E8%B5%B7%E5%86%99Makefile&variant=zh-cn

    2)补充一些

    a)生成.so和生成.a文件的办法

    #生成.a文件
    main:util.o ar rc libddd.a util.o util.o:util.h g++ -c util.cpp clean: rm -rf *.o

     

    #生成.so文件

    main:test.o util.o
      g++ -lddd -L/home/liud/makefile/util/src/ test.cpp

    util.o:util.h
      g++ -o libddd.so -fPIC -shared util.cpp

    clean:
      @rm -rf *.o *.so

    b)链接so和a文件

      g++ test.cpp -lddd -L/home/liud/makefile/util/src/

      l是连接的库名字。注意库必须是lib***.so 或少lib***.a。只需要写***名字就行

      L是连接的路径。

      LD_LIBRARY_PATH:这个环境变量指示动态连接器可以装载动态库的路径。默认会在当前目录和/usr/lib下面寻找这个库。如果有root权限的话,可以修改/etc/ld.so.conf文件,然后调用 /sbin/ldconfig来达到同样的目的,不过如果没有root权限,那么只能采用输出LD_LIBRARY_PATH的方法了。

    c)另外一些选项

      -I参数,包含头文件目录

      -O参数,这是一个程序优化参数,一般用-O2就是,用来优化程序用的,比如gcc test.c -O2,优化得到的程序比没优化的要小,执行速度可能也有所提高

      -c                 编译为目标文件,不连接库

      -Wwarn...     设置警告,可以设置的警告开关很多,通常用-Wall开启所有的警告

      -Dname=definition... 在命令行上定义宏,有两种方式,-Dname或者-Dname=definition.在命令行上设置宏定义的目的主要是为了在调试的时候设定一些开关, 而在发布的时候再关闭或者打开这些开关即可,当然宏定义也用来对代码进行有选择地编译.另外也还有其他的一些作用.
      -Uname       取消宏定义name,作用和上面的正好相反.

      -g选项,产生供gdb调试用的可执行文件

      

    d)make 编译有个很好用的选项,make -j8 #可以选择多核编译

    3)附送一个例子

      

    #####################################################################
    # 		 contact_dbg Makefile     			                  #
    ######################################################################
    CC         := g++
    LD         := ld
    AR         := ar
    READELF    := readelf 
    ROOT_DIR   := $(shell pwd)
    SRC_DIR    := $(ROOT_DIR)/src
    LIB_DIR    := $(ROOT_DIR)/lib
    INC_DIR    := $(ROOT_DIR)/include 
    INC_DIR    += $(ROOT_DIR)/logcommon 
    INC_DIR    += $(ROOT_DIR)/common/CoreBase 
    INC_DIR    += $(ROOT_DIR)/common/NetModule/include/ 
    INC_DIR    += $(ROOT_DIR)/common/include 
    INC_DIR    += $(ROOT_DIR)/common/common 
    INC_DIR    += $(ROOT_DIR)/common/log4cplus/
    INC_DIR    += $(ROOT_DIR)/common/berkeleydb/include/
    INC_DIR    += $(ROOT_DIR)/protocol
    INC_DIR    += $(ROOT_DIR)/protocol/friend
    
    INSTALL_PATH := $(ROOT_DIR)/bin/
    
    SRC_FILES  := $(wildcard $(SRC_DIR)/*.cpp)                                                                                                                               
    OBJ_FILES  := $(SRC_FILES:.cpp=.o)
    LD_LIBS    := db corebase net rt mysqlclient_r pthread ssl sndalog common2 dbpool log4cplus
    
    ######################################################################
    #		 LIB				                       #
    ######################################################################
    #LIB_NAME   := openapi
    #LIB_SUFFIX := .a
    #LIB_TARGET := lib$(LIB_NAME)$(LIB_SUFFIX)
    
    APP_NAME	:= contact_dbg
    APP_SUFFIX	:= dbg
    SYM_SUFFIX	:= sym
    CONF_SUFFIX	:= conf
    APP_TARGET	:= $(APP_NAME).$(APP_SUFFIX)
    SYM_TARGET	:= $(APP_NAME).$(SYM_SUFFIX)
    CONF_TARGET	:= $(APP_NAME).$(CONF_SUFFIX)
    
    LDFLAGS    := -m32 -L$(LIB_DIR) $(addprefix -l,$(LD_LIBS))
    CFLAGS     := -m32 -O2 -Werror -DTRACE_LOG -I$(SRC_DIR) $(addprefix -I,$(INC_DIR))
    ifeq ($(DEBUG),yes)
    CFLAGS     += -ggdb2 -D__DEBUG 
    endif
    
    .PHONY: all clean
    
    all: $(APP_TARGET) $(OBJ_FILES)
    
    $(APP_TARGET): $(OBJ_FILES)
    	$(CC) -o $(APP_TARGET) $(CFLAGS) $(OBJ_FILES) $(LDFLAGS)
    	@echo *********Build $@ $(APP_TARGET:.a=.so) Successful*********
    	@echo
    
    #make rule
    %.o : %.c
    	$(CC) $(CFLAGS) $(INCLUDES) -c $^ -o $@	
    
    %.o : %.cpp
    	$(CC) $(CFLAGS) $(INCLUDES) -c $^ -o $@
    
    
    install:
    	@echo install...
    	cp $(APP_TARGET) http://www.cnblogs.com/update -r
    	cp $(APP_TARGET) $(INSTALL_PATH)$(APP_NAME)  -r
    
    clean:
    	@echo clean...
    	@rm -rf $(LIB_TARGET) $(LIB_TARGET:.a=.so) $(OBJ_FILES) $(LIB_TARGET:.a=.bin) *.log
    	
    #make print
    print: $(SOURCES)
    	lpr -p $?
    	touch print
    
    	
    

      

  • 相关阅读:
    vue this触发事件
    jQuery获取地址栏中的链接参数
    vue 省市区三级联动
    图片文字css小知识点
    sticky footer 模板
    Django学习——用户自定义models问题解决
    Django学习——全局templates引用的问题
    Django的学习——全局的static和templates的使用
    selenium登录爬取知乎出现:请求异常请升级客户端后重试的问题(用Python中的selenium接管chrome)
    使用python远程连接数据库
  • 原文地址:https://www.cnblogs.com/xloogson/p/2662578.html
Copyright © 2011-2022 走看看