1. 生成.so动态库

示例一

SoVer = 10010110
CfgVer = 10010110

BinName = fnights.so
GameName = "\"fnights\""
GameID = 100

BIN = $(BinName).$(SoVer)

all: clean compilerelease

clean:
    rm -f $(BIN) *.o

compilerelease:
    g++ -fPIC -O -shared -DNDEBUG -Wall -g -D_GAME_ID=$(GameID) -D_GAME_NAME=$(GameName) -D_CFG_VERSION=$(CfgVer) -o $(BIN) ./*.cpp

注:-fPIC:编译为位置独立的代码,so带上该选项以达到代码段共享的目的;-shared:编译为动态连接库

-D:定义预编译值;-O:表示启用优化;-Wall:打印出gcc提供的警告信息;-o:指定输出的目标文件名

示例二

CPP = g++
SRCPATH = $(CURDIR)

SRCINCLUDE = $(SRCPATH)/Include/ServerFrame/
LIBSRCINCLUDE = $(SRCPATH)/Include/BaseLib/
COMMONDEF = $(SRCPATH)/Include/CommonDef/
PUBLIC_INC = ${HOME}/project/public/include/

INCLUDE = -I $(PUBLIC_INC) -I $(SRCINCLUDE) -I $(LIBSRCINCLUDE) -I $(COMMONDEF)

ALLLIBSPATH = -L$(SRCPATH)/Include/LibStatic/ -L/usr/local/lib -L${HOME}/project/public/lib -L$(SRCPATH)/Include/Lib/
SLIBS= -lbase
DLIBS= -lGameServer

C_ARGS = -g -Wall -rdynamic -D_DEBUG_ -D_POSIX_MT_ -D_FILE_OFFSET_BITS=64 -fstack-protector-all $(INCLUDE) -fPIC -O2
VERSION_STR = +++ This is a DEBUG Lib!! +++
BINARY = libGame.so

SUBDIR = Msg
SUBSRC=$(shell find $(SUBDIR) -name '*.cpp')
SUBOBJ=$(SUBSRC:%.cpp=%.o)

SO_OBJS = $(patsubst %.cpp,%.o,$(wildcard *.cpp)) $(patsubst %.c,%.o,$(wildcard *.c))
SOOBJS = $(SO_OBJS) $(SUBOBJ)

%.o : %.cpp
    $(CPP) $(C_ARGS) -c $< -o $@
%.o : %.c
    $(CPP) $(C_ARGS) -c $< -o $@

all : clean $(BINARY)

$(BINARY) : $(SOOBJS)
    rm -f $@
    $(CPP) $(C_ARGS) -o $@ $(SOOBJS) $(ALLLIBSPATH) -Wl,-Bstatic $(SLIBS) -Wl,-Bdynamic $(DLIBS) -fPIC -shared
    @echo
    @echo $(VERSION_STR)
    @echo

clean:
    rm -f $(SOOBJS)

注:-I:指定文件查找路径;-L:链接外部静态库与动态库的查找路径;

-l:指定动态库与静态库的名称(最后库的文件名为:libbase.so、libGameServer.so或libbase.a、libGameServer.a),同时存在同名的静态库与动态库时,会优先匹配动态库;

-rdynamic:指示连接器把所有符号(而不仅仅只是程序已使用到的外部符号)都添加到动态符号表(即.dynsym表)里,以便dlopen或backtrace等函数使用;

-fstack-protector:启用堆栈保护,不过只为局部变量中含有char数组的函数插入保护代码;

-Wl:告诉编译器将后面的参数传递给链接器;

-Wl,-Bstatic:告诉链接器对接下来的-l选项使用静态链接;

-Wl,-Bdynamic:告诉链接器对接下来的-l选项使用动态链接;

+++++++++++++++++++++++++++++++++++++++

动态库链接时搜索路径顺序如下:
(1)-L参数指定的路径
(2)环境变量LD_LIBRARY_PATH指定的路径
(3)配置文件/etc/ld.so.conf中指定的路径
(4)/lib; /usr/lib;

+++++++++++++++++++++++++++++++++++++++

2. 生成.a静态库

LibVer = 10010100

CFLAGS = $(CFLAG)
CC = gcc
CPP = g++
CFLAGS += -g -D_SOLIB_VERSION=$(LibVer) -DGAME_SO -I./ -I../Common -I../Externals/SDK/INCLUDE/COMMON -I../Externals/SDK/INCLUDE/SERVER -I./include -I./SoLogicCtrl
ADDLIB = ../Externals/SDK/solib/libSDK.a
LIB = libGame.a
all:$(LIB)

%.o : %.cpp
    $(CPP) $(CFLAGS) -c $< -o $@

%.o : %.c
    $(CC) $(CFLAGS) -c $< -o $@

ADDOBJS = BillReporter.o \
CreateLogic.o \
SoGameLogic.o \
./include/SvrCommonDef.o \
./SoLogicCtrl/SoBaseLogicCtrl.o \
../common/GameCommonDef.o

$(LIB): $(ADDOBJS)
    ar -rf $@ $(ADDOBJS)

install:
    cp $(BIN) /home/game/dll/$(BIN)
    chmod g+w /home/game/dll/$(BIN)

clean:
    rm -f ./*.o
    rm -f ./SoLogicCtrl/*.o
    rm -f ../Common/*.o
    rm -f ./include/*.o
    rm -f $(LIB)

+++++++++++++++++++++++++++++++++++++++

静态库链接时搜索路径顺序:
(1)-L参数指定的路径
(2)环境变量LIBRARY_PATH指定的路径
(3)/lib; /usr/lib; /usr/loacl/lib;

+++++++++++++++++++++++++++++++++++++++

3. 生成可执行程序

CC=gcc
CXX=g++

MOD = -g -D_DEBUG
INC = -Iinclude -Iutil

LIB_SRC = util/md5.cpp \
queue.cpp

LIB_OBJ = md5.o \
queue.o

LIB = libmd5.a
EXE_SRC = impl.cpp
EXE_OBJ = impl.o
EXE = clt

all: $(LIB) $(EXE)

$(LIB): $(LIB_OBJ)
    @rm -f $(LIB)
    ar q $(LIB) $(LIB_OBJ)

$(LIB_OBJ): $(LIB_SRC)
    $(CC) -c $(LIB_SRC) $(MOD) $(INC)

$(EXE): $(EXE_OBJ)
    $(CXX) -o $(EXE) $(EXE_OBJ) $(LIB)

$(EXE_OBJ): $(EXE_SRC)
    $(CC) -c $(EXE_SRC) $(MOD) $(INC)

.PHONY: clean
clean:
    -rm -f $(LIB) $(LIB_OBJ) $(EXE) $(EXE_OBJ)

最后会输出名为clt的可执行程序;clt依赖libmd5.a的静态库,libmd5.a有修改时,会先编译libmd5.a

makefile示例的更多相关文章

  1. gcc链接g++编译生成的静态库和动态库的makefile示例

    使用c++开发程序或者库时,将库提供给其他人使用. 然而使用者是使用c开发的程序,链接g++编译生成的库时,于链接gcc生成的库,有所不同. 首先是静态库,以链接g++编译生成的libmylib.a为 ...

  2. 用于OpenRISC的Makefile示例

    #* #*********************************************************************************************** ...

  3. 用于RISC-V的Makefile示例

    # Initialize ASM For RISC-V .section .text.entry .option norvc .global _start .macro push_reg addi s ...

  4. 简单makefile示例

    Makefile cmd: - g++ 相信在linux下编程的没有不知道makefile的,刚开始学习linux平台下的东西,了解了下makefile的制作,觉得有点东西可以记录下. 下面是一个极其 ...

  5. 【嵌入式开发】 嵌入式开发工具简介 (裸板调试示例 | 交叉工具链 | Makefile | 链接器脚本 | eclipse JLink 调试环境)

    作者 : 韩曙亮 博客地址 : http://blog.csdn.net/shulianghan/article/details/42239705  参考博客 : [嵌入式开发]嵌入式 开发环境 (远 ...

  6. makefile基础(GNU)

    makefile的核心 targets : prerequisites ; commands...   //不分行的情况 targets : prerequisites                 ...

  7. Makefile学习笔记

    ls -l 查看文件详细信息 1.gcc -E test.c -o test.i//预编译gedit test.i //查看:高级C 2.gcc -Wall -S test.i -o test.s// ...

  8. makefile的编写规则

    2.       编写makefile 示例: test:main.o func.o gcc -o test main.o func.o func.o:func.c gcc -c func.c mai ...

  9. 从零开始编写动态库文件Makefile,C++版

    这篇文章前,假设你已经看过<跟我一起写Makefile(一)>,陈皓写的那个. 对现有的一个C++动态库文件和调用程序,分别编写Makefile文件,从零开始,花了四天时间才搞清楚一半,生 ...

随机推荐

  1. c语言数据问题

    变量都有作用域,链接属性,和存储类型3个属性,这三个属性决定了变量的作用域和生存期的问题 在c语言中包含4中类型, 整形 浮点型 指针 聚合类型(数组,结构体等) ------------------ ...

  2. 基于用户相似性的协同过滤——Python实现

    代码基本来自项亮的<推荐系统实践>,把书上的伪代码具体实现,还参考了https://www.douban.com/note/336280497/ 还可以加入对用户相似性的归一化操作,效果会 ...

  3. MySQL知识点链接

    1.使用ab进行压力测试详解                                         http://www.365mini.com/page/apache-benchmark. ...

  4. linux下打包文件或文件夹

    转自:    在linux下如何将文件夹打包                 http://blog.csdn.net/cynhafa/article/details/7303338 linux zi ...

  5. KendoUI之kendoGrid服务端分页

    parameterMap:设定传递给服务器的当前页数与每页大小,django下用get方法有效,post方法无法取得这2个参数shema.total:设定总行数serverPaging: true / ...

  6. mount --bind 重启后失效的解决办法

    vsftp不支持软链接,可以用mount来支持不同的目录结构 mount --bind /home/www/web/ROOT/img/upload /ftp/private/upload 重启后失效. ...

  7. Unity3d 残影效果(狂拽炫酷叼炸天)

    效果图,真的很叼啊 我根据别人的改进了一版,支持MeshFilter上的Mesh(需要确保Mesh的Read/Write是开启的否则不能正常工作) 非常感谢原作者给提供思路.http://blog.c ...

  8. 在linux环境编译boost

    1.在boost官网:http://www.boost.org/下载相应版本的boost 2.解压boost到相应目录,在boost跟目录下有b2可执行程序,可以通过输入命令“/b2 --help”, ...

  9. 【leetcode】Merge Intervals(hard)

    Given a collection of intervals, merge all overlapping intervals. For example,Given [1,3],[2,6],[8,1 ...

  10. 【mongo】mongo数据转json时特殊类型处理

    mongo数据库中的有些数据类型是无法用json序列化的,比如ObjectId或者datetime.datetime类型. 可以通过json.JSONEncoder来处理 import json im ...