不懂 C/C++程序编译,该怎么学习编译?

2018-10-15 14:24:45 +08:00
 css3

如题,现在接到的写 C/C++的活儿(有其他语言基础),代码写是勉强可以写出来,但编译却成了大问题,我下述疑问(主要是 linux 平台)

2069 次点击
所在节点    程序员
11 条回复
arzterk
2018-10-15 14:37:31 +08:00
主要就是搞懂编译器基本原理:预编译-编译-链接这些
然后 Linux 编译主要搞懂 makefile,现在有工具可以直接生成 makefile,如 CMake 等
waruqi
2018-10-15 14:42:02 +08:00
用 xmake 就好 傻瓜式跨平台编译 https://github.com/tboox/xmake
sbw
2018-10-15 14:54:12 +08:00
g++ 是编译器,干活的 。
makefile/cmake 等是 build system,帮助你调用 g++ 干活的,解放双手而已。
windows 下的 sln 等等也是工程描述,干活的还是 cl.exe 。
看题目还以为 lz 要搞编译器(
qakito
2018-10-15 14:58:47 +08:00
目标文件的生成最终还是由 gcc/g++来完成
makefile 是通过制定格式的规则来自动执行 gcc/g++
cmake 是通过制定格式来帮你生成 makefile

cmake 生成 makefile -> makefile 执行 gcc/g++ -> gcc/g++生成目标文件

为什么要用 makefile ?
项目规模大时,靠一条条执行 gcc/g++效率低

为什么要用 cmake ?
项目规模大时,方便维护 makefile,尤其是需要跨平台编译以及有诸多编译选项时
402124773
2018-10-15 14:59:16 +08:00
怎么系统的学习 C/C++代码编译,让我写完代码不再害怕编译
看看那本《程序员的自我修养-编译连接与库》,大概的原理就明白些了。
wutiantong
2018-10-15 15:09:05 +08:00
g++不是不用,而是不直接使用,比如你用 cmake 时,其实真正负责编译的可能就是 gcc

“我也只会这种编译” ——
所以理论上你当然可以无视那些 CMakeLists.txt 继续手动调用 g++编译,而且这样的做法有助于你厘清眼前的这些困惑

--------------
然后义无反顾的再也不想手动调 g++了
iwtbauh
2018-10-15 15:11:49 +08:00
先学 Makefile,用 Makefile 自动化构建
然后再学 autoconf

恕我直言,cmake 是我用过的最难用的自动化构建工具了
waruqi
2018-10-15 15:40:11 +08:00
@iwtbauh 那可以试试 xmake 哦。。:)
waruqi
2018-10-15 15:46:39 +08:00
个人建议楼主可以试试 xmake,cmake 最终还是需要生成 makefile,vcproj 来编译,受限于 make/msbuild,而 xmake 是完全脱离这些,直接去构建,完全的跨平台一致性维护和构建

关键是如果你是新手,在源码目录执行 xmake,即使没有任何类似 makefile 文件,xmake 也会自动帮你扫描检测,自动生成一个 example 让你快速上手

并且如果你敲 xmake -v 去编译的话,有完整详细的编译命令和流程,对于理解 gcc/cl.exe 以及 link 过程,也是一目了然的。。
HHehr0ow
2018-10-15 22:55:04 +08:00
1. 为什么实际工程中不用 g++ 命令?
其实也用,只不过是隐含在 makefile 里,执行 makefile 时候会自动调用。很多参考书给的用例,因为只有一个 cpp 文件,特意编写 makefile 来组织显得过于繁冗,因而直接一句 g++ 命令生成目标文件方便快捷。而实际工程中动辄几百个 cpp/header/so/a 文件,文件之间还存在依赖关系,这种情况下仍然手工一句一句 g++ 来编译实在过于复杂而且低效。

2. makefile 本质就是描述工程中的依赖关系和编译参数。执行时会自动根据依赖关系确定编译顺序,按序编译。makefile 是 unix-like 系统下的解决方案,Windows 下一般使用 MSVC 的 sln 工程文件。本质都是一样的东西。CMake 是一个跨平台的解决方案,执行时根据选择的目标平台不同将 CMakeList.txt “翻译”成 makefile 或者 vcxproj。

3. 自己搞个几十个 cpp 的小项目,跑一跑,在实践中摸索熟悉吧。相关的书籍有 《程序员的自我修养》、《 GNU Make 项目管理》。还有个文章《跟我一起写 Makefile 》。
css3
2018-10-16 11:16:43 +08:00
@arzterk
@waruqi
@sbw
@qakito
@402124773
@wutiantong
@iwtbauh
@waruqi
@HHehr0ow
多谢各位的热心解答,我按各位的建议学习一下。

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

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

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

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

© 2021 V2EX