学习6个月后,笔记如下:
按照vs形式划分的目录
|--makefile 项目makefile
|--include 目录 共享头文件
|--out32 生成结果目录
|--mini 执行文件
|--applog 日志模块,共享库
|--memory 内存管理模块,静态库
使用emacs编辑。
c文件都很简单,暂不宜一一列举了。
项目makefile
#生成目标
all:myapp
#编译选项
CC = gcc
AR = ar
CFLAGS = -g -Wall -ansi
#目标文件夹
OUTPUT_FOLDER = ./out32/
DST_FOLDER = ../$(OUTPUT_FOLDER)
#头文件路径
INCLUDE = . /usr/include
#模块路径
LOG_FOLER = applog
MAIN_FOLER = mini
MEM_FOLDER = memory
#模块生成目标
APP_LOG_OBJ = libapplog.so
MAIN_OBJ = mini
MEM_OBJ = libmm.a
#进入不同的模块,执行makefile后,复制结果到目标文件夹
$(APP_LOG_OBJ):
(cd $(LOG_FOLER);$(MAKE))
(cd $(LOG_FOLER);mv -f $(APP_LOG_OBJ) $(DST_FOLDER)$(APP_LOG_OBJ))
$(MEM_OBJ):
(cd $(MEM_FOLDER);$(MAKE))
(cd $(MEM_FOLDER);mv -f $(MEM_OBJ) $(DST_FOLDER)$(MEM_OBJ))
#存在依赖项
$(MAIN_OBJ):$(MEM_OBJ)
(cd $(MAIN_FOLER);$(MAKE))
(cd $(MAIN_FOLER);mv -f $(MAIN_OBJ) $(DST_FOLDER)$(MAIN_OBJ))
#目标依赖项
myapp:$(APP_LOG_OBJ) $(MEM_OBJ) $(MAIN_OBJ)
#清除结果
clean:
(cd $(LOG_FOLER);$(MAKE) clean)
(cd $(MAIN_FOLER);$(MAKE) clean)
(cd $(MEM_FOLDER);$(MAKE) clean)
(cd $(OUTPUT_FOLDER);rm $(APP_LOG_OBJ) $(MAIN_OBJ) $(MEM_OBJ))
#applog模块c文件
#头文件
#include <stdio.h>
#include "applog.h"
#include "applogIf.h"
#实现...
makefile
all:libapplog.so
CC = gcc
AR = ar
#头文件路径
INCLUDE = . /usr/include
PROJECT_INCLUDE = ../include
CFLAGS = -g -Wall -ansi
#makefile用来定位依赖项的目录,makefile保留字
VPATH = ../include
applog.o: applog.c applog.h applogIf.h #没有VPATH的话,applog.h applogIf.h有更新,则不会自动重新编译
$(CC) -fPIC -I$(INCLUDE) -I$(PROJECT_INCLUDE) $(CFLAGS) -c applog.c
libapplog.so:applog.o
$(CC) -shared -fPIC -Wl,-soname,libapplog.so.1 -o libapplog.so applog.o
选项: 共享库 平台无关性
clean:
-rm *.o
#mini makefile
all:mini
CC = gcc
AR = ar
INCLUDE = . /usr/include
INCLUDE_LOG = ../applog
LIB_OUTPUT= ../out32
INCLUDE_PARENT = ../include
MEM_OBJ = libmm.a
VPATH = ../include
CFLAGS = -g -Wall -ansi
mini.o: mini.c app.h applogIf.h loadso.h memif.h tcpclientif.h
$(CC) -I$(INCLUDE) -I$(INCLUDE_PARENT) $(CFLAGS) -lapplog -Wl,-rpath,./ -c mini.c
选项: -lapplog 需要共享库libapplog.so
-Wl,-rpath,./ 共享库定位优先从当前目录查询
mini: mini.o help.o
$(CC) -o mini mini.o help.o -Wl,-rpath,./ -L$(LIB_OUTPUT) -lmm -lpthread
clean:
-rm *.o
#memory makefile
all:libmm.a
CC = gcc
AR = ar
INCLUDE = . /usr/include
CFLAGS = -g -Wall -ansi
VPATH = ../include
mem.o: mem.c mem.h memif.h
$(CC) -fPIC -I$(INCLUDE) $(CFLAGS) -c mem.c
libmm.a:mem.o
$(AR) rcs libmm.a mem.o
选项:静态库
clean:
-rm mem.o libmm.a
完成以上3种形式的文件创建后,下一步正式进入linux的世界了。
虽然现在我还是windows程序员。