码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • ubuntu编写makefile编译c++程序


    常见的编译工具

    • gcc/g++
    • visual c++
    • clang

    编译一个简单的程序
    main.cpp

    #include 
    
    int main()
    {
        std::cout << "hello world" << std::endl;
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    gcc 编译
    源文件(.cpp)编译生成目标文件(.o)

    gcc -c main.cpp -o main.o
    
    • 1

    gcc 链接
    目标文件(.o)链接生成可执行文件

    gcc main.o -o main
    
    • 1

    报错

    root@31135f61935f:~/hello# gcc main.o -o main
    /tmp/ccVubJEp.o: In function `main':
    main.cpp:(.text+0xa): undefined reference to `std::cout'
    main.cpp:(.text+0xf): undefined reference to `std::basic_ostream >& std::operator<<  >(std::basic_ostream >&, char const*)'
    main.cpp:(.text+0x14): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)'
    main.cpp:(.text+0x1c): undefined reference to `std::ostream::operator<<(std::ostream& (*)(std::ostream&))'
    /tmp/ccVubJEp.o: In function `__static_initialization_and_destruction_0(int, int)':
    main.cpp:(.text+0x4a): undefined reference to `std::ios_base::Init::Init()'
    main.cpp:(.text+0x59): undefined reference to `std::ios_base::Init::~Init()'
    collect2: error: ld returned 1 exit status
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    解决方法:
    方式一

    gcc -c main.cpp -o main.o
    gcc main.o -o main -lstdc++
    
    • 1
    • 2

    两条命令合并

    gcc main.cpp -o main -lstdc++
    
    • 1

    方式二

    g++ -c main.cpp -o main.o
    g++ main.o -o main
    
    • 1
    • 2

    两条命令合并

    g++ main.cpp -o main
    
    • 1

    c++ 编译流程

    1. 预处理
    2. 编译
    3. 汇编
    4. 链接
      在这里插入图片描述
      预处理
      把 #include 语句以及一些宏插入程序文本中,得到 *.i 文件。
    g++ -E main.cpp -o main.i
    
    • 1

    编译
    将文本文件 *.i 文件编译成文本文件 *.s 的汇编语言程序。

    g++ -S main.i -o main.s
    
    • 1

    汇编
    将 *.s 翻译成机器语言的二进制指令,并打包成一种叫做可重定位目标程序的格式,并将结果保存在 *.o 文件中。

    g++ -c main.s -o main.o
    
    • 1

    链接
    合并全部 *.o 文件,得到可执行文件。

    g++ main.o -o main
    
    • 1

    预处理、编译、汇编合并

    g++ -c main.cpp -o main.o
    g++ main.o -o main
    
    • 1
    • 2

    预处理、编译、汇编、链接合并

    g++ main.cpp -o main
    
    • 1

    参考视频:

    如何编译 C++ 程序:轻松搞定 Makefile

    参考链接:
    如何编译 C++ 程序:轻松搞定 Makefile

  • 相关阅读:
    Java基础面试题【1】
    【深入设计模式】装饰模式—什么是装饰模式?装饰模式在源码中的应用
    SQL库函数
    【TUM公开数据集RGBD-Benchmark工具evaluate_ate.py参数用法原理解读】
    PAT乙级1042 字符统计
    搜维尔科技:【工业仿真】煤矿安全知识基础学习VR系统
    循环结构(for/in 语句、for/of语句以及for of与for in 区别)
    【mia】rtcdn-draft 基于http的rtc订阅及mia实现
    高防DNS如何实现对DDoS攻击的流量清洗?
    cas:174501-64-5|1-丁基-3-甲基咪唑六氟磷酸盐|[C4MIm]PF6离子液体
  • 原文地址:https://blog.csdn.net/qq_44091004/article/details/133722816
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号