一个简单实用的 C 工程示例, 附简洁的 Makefile

143 天前
 zhng920823

Makefile 可以做到如下简洁, 实际用时只要修改 EXE 和 OBJ 的列表值, 无需关心其它的东西

EXE=\
exe1\
a/exe2\
a/exe3\

OBJ=\
mod1\
liba/mod2\
liba/mod3\

include inc.mak

工程源码 https://github.com/webd90kb/webd/tree/master/codes/c_project_template

2682 次点击
所在节点    C
27 条回复
augustheart
143 天前
看了一下,分享精神可嘉,不过聊胜于无吧,用处很狭窄。
实际上照本宣科写个 makefile ,目录分好。然后一个通配符也差不多效果了,最后每次就拷贝这 makefile ,修改一下输出目标名。
w568w
143 天前
要我说 Makefile 这种东西早就应该扔进历史垃圾桶了。

多亏了 Autotools 家族:

1. 直到今天 C/C++ 项目的构建和编译还是充满了不在文档中的命令行参数、不知名的环境变量、随心所欲的模块管理和依赖地狱;
2. 甚至每个项目都不得不自己编写一个 INSTALL 或 BUILD 文档来专门教别人如何编译;
3. Autotools 既不通用也不思进取,直到今天依然和 GCC 、glibc 强绑定,AM 宏语法残缺不全、极难理解,并且只支持「 GNU 认为你只需要」的寥寥几门语言和功能,充满了 quirks ,和其他语言的互操作更是无解问题。说是公共构建工具,更像是一群 geeks 自己开发自娱自乐的产物;
4. Makefile 完全没有考虑不同 Shell 和 Platform 的问题,想要跨平台编译,开发者不得不自己考虑并编写几百行的 boilerplates 来适配新的构建平台(例如 Windows )。

CMake is better, and Meson is even better.

如果你需要一个命令行运行器,你应该用 just 或 ninja 。
zhng920823
143 天前
@w568w #2 所以不用 Autotools 那套东西, 直接用 Makefile, 我这个 Makefile 也可以同时用在 windows 上的 mingw
zhng920823
143 天前
@augustheart #1 这个是从我自己用的项目里抽出来的, 可以一个工程里多个可执行文件, 久而久之这个工程里的东西就越来越多越来越杂, 依赖关系越来复杂, 编译越来越慢. 因为每一个 EXE 依赖所有的 OBJ.
w568w
143 天前
@zhng920823 是啊,我知道可以用,我自己也不是没干过这事。后来换到 CMake 、Meson 才发现:干,这些事原来根本不用自己操心维护。Makefile 里判断平台大多是白忙活!

别人写了十几年的轮子了,兼容性自然远高于我们手写的几行 Makefile 。与其遇到一个不兼容问题修复一个,不如直接用现代化构建工具。

另外,只有第 3 个缺点和 autotools 有关啊,1 、2 、4 点 Makefile 都有。
zhng920823
143 天前
@w568w #5 一直不太喜欢 cmake 等这种"大"公司推行的东西
我觉得 xmake 非常好, @waruqi 但是 xmake 没有很广泛流行开来.
w568w
143 天前
@zhng920823 #6 CMake 被大公司推行的好处是能统一。另外,Meson 作为纯社区项目,其实没有被大公司裹挟吧?

我也喜欢 xmake ,还贡献过代码。xmake 的问题可能是包装得太深了,想要做一些自定义很困难,以及没有一个 CMake 级别的 behavior reference 文档。
zhng920823
143 天前
@w568w #7 我也觉得 xmake 搞的越来越强大了, 早期简单的版本就够用.
Meson/Ninja 目前看来还行.
个人而言, 还是继续坚持手写 Makefile, 我觉得这样最透彻, (或者说是和已有项目绑定太深)
ipwx
143 天前
@zhng920823 我曾经也排斥用别人包了一层又一层的东西,觉得什么东西都自己写底层很舒服。

直到我毕业了,从兴趣驱动到工资驱动……
augustheart
143 天前
@zhng920823 xmake 是愿景太大了,它想覆盖的每个场景都会有很多具体问题,需要各种针对修正。比如我个人的场合比较非主流,就是 msys2 那套在 win 下面编译,前后就提了好些 issue 。(其实最严重的问题是文档失修)
至于 makefile ,没必要坚持,早改早好。makefile 所代表的那点知识没啥好透彻的。
GeruzoniAnsasu
143 天前
我就提一个小问题:

怎么写单元测试?
zhng920823
143 天前
@GeruzoniAnsasu #11 再加个 exe, 或者现有的 exe 里面根据参数进入测试分支.
zhng920823
143 天前
@augustheart #10 不是说 makefile 的知识透彻, 而是说这套东西简单透彻,
GeruzoniAnsasu
143 天前
@zhng920823

10 个 lib source, 10 个单测 source

我需要写 _ 个 makefile, 每个 makefile 里复制粘贴 _ 行 source

新增 1 个 lib source 的时候 我需要修改 _ 个文件中的 _ 行?
zhng920823
143 天前
@GeruzoniAnsasu #14
10 个 lib source, 10 个单测 source
我需要写 1 个 makefile, 每个 makefile 里复制粘贴 20 行 source
新增 1 个 lib source 的时候 我需要修改 1 个文件中的 1 行

不过我还有一套和 IDE 结合的工具, 能把这些工作自动化. 这个 Makefile 是单独提取出来展示给大家的.
cnbatch
143 天前
虽然我也不那么喜欢 cmake ,但更不喜欢 GNU Makefile ,因为我需要兼顾 BSD 系统( BSD Makefile 稍有不同),所以最后还是要用 cmake 兜底
proxytoworld
143 天前
我用 xmake 尝试引入 cmake ,但编译错误,搞了半天,太难了,最后还是用了 cmake 的 hunter
424778940
143 天前
makefile 早就该被淘汰了, 又是写他都不如写个 shell 脚本方便, 或者说这东西就是个特别一点的 shell 脚本
makefile, 尤其是 autotools 沾边的, 语法奇怪, 文档残废, 每次改点啥都要进去看代码, 因为变量名和选项都没有标准

我现在一律使用 cmake, 虽说也没有特别先进, 有些地方还是有"无法指定这个操作到底 config 还是 build 时候执行"的问题, 但配合任何 shell 脚本基本都能解决 90%以上的场景需求了

楼主你这个 makefile, 用 cmake 应该不到一半的行数就能写完
zhng920823
143 天前
@proxytoworld #17 可惜 xmake 不能直接支持 cmake

@424778940 #18 Makefile 肯定比 shell 方便的, 这点不用质疑, 毕竟是专门干这个的.
所以我说 Makefile\可以单独使用, 不碰 autotools 那些东西可以做到很简单的.
augustheart
143 天前
@proxytoworld 通过 xmake 调用 cmake ,其实只是把传给 cmake 的参数给复制过去就好了,xmake 使用 package.tools.cmake ,等价于通过命令行调用 cmake 。需要注意的只有环境问题( xmake 的执行环境和 cmake 的执行环境并不一定是一样的)。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1055621

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX