C语言项目编译
在《linux-Unix系统编程》一书中,发现作者的源码编译写的非常高明。虽然尚不能完全理解,顺手牵过来分享给大家。
一、项目结构
首先,项目的目录结构如下,lib是共享的源文件,fileio是一个模块,fileio的源文件会依赖到lib中的文件,这也是一般项目的结构
. ├── fileio │ ├── main │ ├── main2 │ ├── main2.c │ ├── main.c │ └── makefile ├── lib │ ├── function.c │ ├── function.h │ └── Makefile ├── libtlpi.a ├── Makefile └── Makefile.inc
二、一级目录的Makefile
一级目录的Makefile是make命令的配置文件,大概是按顺序将所有二级目录进行构建,这里的lib一定要在fileio之前
DIRS = lib fileio all: for i in $(DIRS); do \ (cd $$i && echo "making $$i" && $(MAKE) ) || exit 1; \ done allgen: for dir in ${DIRS}; do (cd $${dir}; ${MAKE} allgen) ; done clean: for i in $(DIRS); do \ (cd $$i && echo "cleaning $$i" && $(MAKE) clean) || exit 1; \ done
一级目录的Makefile.inc是二级目录的Makefile都要引用到的
TLPI_DIR = .. TLPI_LIB = ${TLPI_DIR}/libtlpi.a TLPI_INCL_DIR = ${TLPI_DIR}/lib LINUX_LIBRT = -lrt LINUX_LIBDL = -ldl LINUX_LIBACL = -lacl LINUX_LIBCRYPT = -lcrypt LINUX_LIBCAP = -lcap IMPL_CFLAGS = -std=c99 -D_XOPEN_SOURCE=600 \ -D_DEFAULT_SOURCE \ -g -I${TLPI_INCL_DIR} \ -pedantic \ -Wall \ -W \ -Wmissing-prototypes \ -Wno-sign-compare \ -Wno-unused-parameter CFLAGS = ${IMPL_CFLAGS} IMPL_THREAD_FLAGS = -pthread IMPL_LDLIBS = ${TLPI_LIB} -lm LDLIBS = ${IMPL_LDLIBS} RM = rm -f
三、lib下的Makefile
include ../Makefile.inc allgen : ${TLPI_LIB} ${TLPI_LIB} : *.c ${CC} -c -g ${CFLAGS} *.c ${RM} ${TLPI_LIB} ${AR} rs ${TLPI_LIB} *.o clean : ${RM} *.o ${TLPI_LIB}
四、fileio中的makefile
include ../Makefile.inc GEN_EXE = main main2 LINUX_EXE = EXE = ${GEN_EXE} ${LINUX_EXE} all : ${EXE} allgen : ${GEN_EXE} clean : ${RM} ${EXE} *.o showall : @ echo ${EXE} ${EXE} : ${TLPI_LIB}
其中fileio/main.c,lib/function.h lib/function.c代码都在上一篇文章中,这里就不贴了
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端