如题,现在接到的写 C/C++的活儿(有其他语言基础),代码写是勉强可以写出来,但编译却成了大问题,我下述疑问(主要是 linux 平台)
1
arzterk 2018-10-15 14:37:31 +08:00
主要就是搞懂编译器基本原理:预编译-编译-链接这些
然后 Linux 编译主要搞懂 makefile,现在有工具可以直接生成 makefile,如 CMake 等 |
2
waruqi 2018-10-15 14:42:02 +08:00 via Android
用 xmake 就好 傻瓜式跨平台编译 https://github.com/tboox/xmake
|
3
sbw 2018-10-15 14:54:12 +08:00
g++ 是编译器,干活的 。
makefile/cmake 等是 build system,帮助你调用 g++ 干活的,解放双手而已。 windows 下的 sln 等等也是工程描述,干活的还是 cl.exe 。 看题目还以为 lz 要搞编译器( |
4
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,尤其是需要跨平台编译以及有诸多编译选项时 |
5
402124773 2018-10-15 14:59:16 +08:00 1
怎么系统的学习 C/C++代码编译,让我写完代码不再害怕编译
看看那本《程序员的自我修养-编译连接与库》,大概的原理就明白些了。 |
6
wutiantong 2018-10-15 15:09:05 +08:00
g++不是不用,而是不直接使用,比如你用 cmake 时,其实真正负责编译的可能就是 gcc
“我也只会这种编译” —— 所以理论上你当然可以无视那些 CMakeLists.txt 继续手动调用 g++编译,而且这样的做法有助于你厘清眼前的这些困惑 -------------- 然后义无反顾的再也不想手动调 g++了 |
7
iwtbauh 2018-10-15 15:11:49 +08:00 via Android
先学 Makefile,用 Makefile 自动化构建
然后再学 autoconf 恕我直言,cmake 是我用过的最难用的自动化构建工具了 |
9
waruqi 2018-10-15 15:46:39 +08:00 1
个人建议楼主可以试试 xmake,cmake 最终还是需要生成 makefile,vcproj 来编译,受限于 make/msbuild,而 xmake 是完全脱离这些,直接去构建,完全的跨平台一致性维护和构建
关键是如果你是新手,在源码目录执行 xmake,即使没有任何类似 makefile 文件,xmake 也会自动帮你扫描检测,自动生成一个 example 让你快速上手 并且如果你敲 xmake -v 去编译的话,有完整详细的编译命令和流程,对于理解 gcc/cl.exe 以及 link 过程,也是一目了然的。。 |
10
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 》。 |