V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
css3
V2EX  ›  程序员

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

  •  
  •   css3 · 2018-10-15 14:24:45 +08:00 · 2042 次点击
    这是一个创建于 2233 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    • g++这种最简单的方法,为什么工作中貌似几乎不用?(或者是我没有看到过),我也只会这种编译
    • 工作中的代码工程中,大部分编译都采用的是 cmake,里边包含了大量的 CMakeList.txt 文件,请问下,这种编译方法的原理是什么?
    • 怎么系统的学习 C/C++代码编译,让我写完代码不再害怕编译
    11 条回复    2018-10-16 11:16:43 +08:00
    arzterk
        1
    arzterk  
       2018-10-15 14:37:31 +08:00
    主要就是搞懂编译器基本原理:预编译-编译-链接这些
    然后 Linux 编译主要搞懂 makefile,现在有工具可以直接生成 makefile,如 CMake 等
    waruqi
        2
    waruqi  
       2018-10-15 14:42:02 +08:00 via Android
    用 xmake 就好 傻瓜式跨平台编译 https://github.com/tboox/xmake
    sbw
        3
    sbw  
       2018-10-15 14:54:12 +08:00
    g++ 是编译器,干活的 。
    makefile/cmake 等是 build system,帮助你调用 g++ 干活的,解放双手而已。
    windows 下的 sln 等等也是工程描述,干活的还是 cl.exe 。
    看题目还以为 lz 要搞编译器(
    qakito
        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,尤其是需要跨平台编译以及有诸多编译选项时
    402124773
        5
    402124773  
       2018-10-15 14:59:16 +08:00   ❤️ 1
    怎么系统的学习 C/C++代码编译,让我写完代码不再害怕编译
    看看那本《程序员的自我修养-编译连接与库》,大概的原理就明白些了。
    wutiantong
        6
    wutiantong  
       2018-10-15 15:09:05 +08:00
    g++不是不用,而是不直接使用,比如你用 cmake 时,其实真正负责编译的可能就是 gcc

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

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

    恕我直言,cmake 是我用过的最难用的自动化构建工具了
    waruqi
        8
    waruqi  
       2018-10-15 15:40:11 +08:00
    @iwtbauh 那可以试试 xmake 哦。。:)
    waruqi
        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 过程,也是一目了然的。。
    HHehr0ow
        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 》。
    css3
        11
    css3  
    OP
       2018-10-16 11:16:43 +08:00
    @arzterk
    @waruqi
    @sbw
    @qakito
    @402124773
    @wutiantong
    @iwtbauh
    @waruqi
    @HHehr0ow
    多谢各位的热心解答,我按各位的建议学习一下。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5694 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 06:43 · PVG 14:43 · LAX 22:43 · JFK 01:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.