makefile示例
1. 生成.so动态库
示例一:
SoVer = 10010110
CfgVer = 10010110BinName = fnights.so
GameName = "\"fnights\""
GameID = 100BIN = $(BinName).$(SoVer)
all: clean compilerelease
clean:
rm -f $(BIN) *.ocompilerelease:
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= -lGameServerC_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.soSUBDIR = 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)
@echoclean:
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 -IutilLIB_SRC = util/md5.cpp \
queue.cppLIB_OBJ = md5.o \
queue.oLIB = libmd5.a
EXE_SRC = impl.cpp
EXE_OBJ = impl.o
EXE = cltall: $(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示例的更多相关文章
- gcc链接g++编译生成的静态库和动态库的makefile示例
使用c++开发程序或者库时,将库提供给其他人使用. 然而使用者是使用c开发的程序,链接g++编译生成的库时,于链接gcc生成的库,有所不同. 首先是静态库,以链接g++编译生成的libmylib.a为 ...
- 用于OpenRISC的Makefile示例
#* #*********************************************************************************************** ...
- 用于RISC-V的Makefile示例
# Initialize ASM For RISC-V .section .text.entry .option norvc .global _start .macro push_reg addi s ...
- 简单makefile示例
Makefile cmd: - g++ 相信在linux下编程的没有不知道makefile的,刚开始学习linux平台下的东西,了解了下makefile的制作,觉得有点东西可以记录下. 下面是一个极其 ...
- 【嵌入式开发】 嵌入式开发工具简介 (裸板调试示例 | 交叉工具链 | Makefile | 链接器脚本 | eclipse JLink 调试环境)
作者 : 韩曙亮 博客地址 : http://blog.csdn.net/shulianghan/article/details/42239705 参考博客 : [嵌入式开发]嵌入式 开发环境 (远 ...
- makefile基础(GNU)
makefile的核心 targets : prerequisites ; commands... //不分行的情况 targets : prerequisites ...
- Makefile学习笔记
ls -l 查看文件详细信息 1.gcc -E test.c -o test.i//预编译gedit test.i //查看:高级C 2.gcc -Wall -S test.i -o test.s// ...
- makefile的编写规则
2. 编写makefile 示例: test:main.o func.o gcc -o test main.o func.o func.o:func.c gcc -c func.c mai ...
- 从零开始编写动态库文件Makefile,C++版
这篇文章前,假设你已经看过<跟我一起写Makefile(一)>,陈皓写的那个. 对现有的一个C++动态库文件和调用程序,分别编写Makefile文件,从零开始,花了四天时间才搞清楚一半,生 ...
随机推荐
- centos7 关闭firewall安装iptables并配置
一.配置防火墙,开启80端口.3306端口 CentOS 7.0默认使用的是firewall作为防火墙,这里改为iptables防火墙. 1.关闭firewall: systemctl stop fi ...
- sublime text 个性设置
http://stackoverflow.com/questions/13781833/sublime-text-2-how-to-change-the-font-size-of-the-file-s ...
- 如何发布及部署asp.net网站
用vs开发完asp.net网站之后如何发布到服务器上去变成正式网站? 1.发布首先需要发布网站,这个步骤就是生成正式网站的目录(把源代码编译成.cs代码文件编译成.dll文件)详细步骤:http:// ...
- Python类的特点 (3) :静态方法与类方法
Python中的方法有4种: 1)模块中的全局方法,不属于任何类,用"模块名.方法名"形式调用. 2)类中定义的实例方法,也被称为绑定方法(Bound method),这种方法的第 ...
- 一个简单的任务执行时间监视器 StopWatch
有时我们在做开发的时候需要记录每个任务执行时间,或者记录一段代码执行时间,最简单的方法就是打印当前时间与执行完时间的差值,然后这样如果执行大量测试的话就很麻烦,并且不直观, 如果想对执行的时间做进一步 ...
- linux上进程状态查询
linux上进程有5种状态: 1. 运行(正在运行或在运行队列中等待) 2. 中断(休眠中, 受阻, 在等待某个条件的形成或接受到信号) 3. 不可中断(收到信号不唤醒和不可运行, 进程必须等待直到有 ...
- linux shell 中 printf 与 echo的区别
echo echo是非常常用的shell命令.参数如下: -e:打开反斜杠字符backslash-escaped的解析,即对/n,/t等字符进行解析,而不视之为两个字符 -E:关闭反斜杠字符 ...
- mysql性能优化-简易版
mysql性能优化 sql语句优化 如何发现有问题的sql? 开启mysql慢查询 show variables like 'slow_query_log' set global slow_query ...
- c++ 文件utf-8格式
#include <stdio.h> int i = 0; while (i < 20) { i++; WriteLog("d:\\log.txt", ...
- “假学习“&”真学习“?(摘)
什么叫做“假学习”? 一.看书 买一堆书,有空看看.看书,这是典型的假学习.看书看不懂还在看,就是假学习,欺骗自己,安慰自己正在学习而已.专业书都写得很好,但大都是写给已经懂的人看的.看书的最大作用就 ...