不懂 C/C++程序编译,该怎么学习编译? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
css3
V2EX    程序员

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

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

    如题,现在接到的写 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
    多谢各位的热心解答,我按各位的建议学习一下。
    关于     帮助文档     自助推广系统     博客 &bsp;   API     FAQ     Solana     2339 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 23ms UTC 15:49 PVG 23:49 LAX 07:49 JFK 10:49
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86