在linux上编译程序,确实是一个苦差事。平时一般用Cmake编译项目。cmake.&&make
1)首先看下陈皓写的跟我一起写makefile
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