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

	

  

posted on 2012-08-29 19:31  51Liuda  阅读(2888)  评论(0编辑  收藏  举报

导航