当前位置: 首页 > news >正文

ubuntu编写makefile编译c++程序

常见的编译工具

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

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

#include <iostream>int main()
{std::cout << "hello world" << std::endl;return 0;
}

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

gcc -c main.cpp -o main.o

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

gcc main.o -o main

报错

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<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, 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

解决方法:
方式一

gcc -c main.cpp -o main.o
gcc main.o -o main -lstdc++

两条命令合并

gcc main.cpp -o main -lstdc++

方式二

g++ -c main.cpp -o main.o
g++ main.o -o main

两条命令合并

g++ main.cpp -o main

c++ 编译流程

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

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

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

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

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

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

g++ main.o -o main

预处理、编译、汇编合并

g++ -c main.cpp -o main.o
g++ main.o -o main

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

g++ main.cpp -o main

参考视频:

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

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

http://www.lryc.cn/news/190498.html

相关文章:

  • 详解COCO数据格式的json文件内容
  • 2023.10.12
  • antd Form shouldUpdate 关联展示 form 数组赋值
  • vue实现一个简单导航栏
  • 每日leetcode_LCP01猜数字
  • 接口自动化测试_L1
  • Windows提权
  • 香港服务器的优势?
  • 关于开展2023年度光明科学城出站博士后生活资助申报工作的通知
  • “.NET视频总结:认识框架的结构和组件,掌握开发工具的奥妙“
  • STM32 CubeMX PWM三种模式(互补,死区互补,普通)(HAL库)
  • Linux系统导入导出docker容器的sql数据
  • SpringBoot之使用Redis和注解实现接口幂等性
  • 《3D 数学基础》几何检测-相交性检测
  • 文字与视频结合效果
  • 大数据Doris(九):配置BE步骤
  • BuyVM 纽约 VPS 测评
  • H3C交换机的40G堆叠线 ,可以插在普通光口做堆叠吗?
  • 【Java 进阶篇】JavaScript三元运算符详解
  • MySQL数据库技术笔记(4)
  • 批量图片转文字识别OCR身份证件信息提取软件
  • Mac/Wins Matlab如何查看APPs源码
  • Web应用-Thinkphp框架-开发指南
  • LeetCode【300】最长递增子序列
  • JRebel在IDEA中实现热部署 (JRebel实用版)
  • uniapp微信小程序之分包异步化之组件分包
  • Nacos(替代Eureka)注册中心
  • FHRP首跳冗余的解析
  • 垂直分表为什么能够加快查询效率?
  • Linux网络基础知识全面总结