Genius
设备:vmware Ubuntu 18.04
源自b站:3.3 【实战】g++命令行编译_哔哩哔哩_bilibili
一、开发环境搭建
1.编译器,调试器的安装
1.1安装GCC,GDB
sudo apt update #更新
sudo apt install build-essential gdb #安装编译器和调试器
1.2 安装成功验证(返回版本号即安装成功)
#查看编译器,调试器版本号
gcc --version
g++ --version
gdb --version
1.3安装CMake,安装验证(返回版本号即安装成功)
sudo apt install cmake
cmake --version
二、GCC编译器
前言:Linux 开发C/C++ 必须熟悉GCC
VSCode 是通过GCC编译器来实现C/C++的编译工作的
1.编译过程
1预处理-Pre-Processing //.i文件
// -E 选项指示编译器对输入文件进行预处理
g++ -E test.cpp -o test.i
2编译-Compiling //.s文件
// -S 编译选项告诉 g++ 为 C++ 产生汇编语言文件
g++ -S test.i -o test.s
3.汇编-Assembling /.o文件
// -c 选项告诉 g++ 仅把源代码编译为机器语言的目标代码
g++ -c test.o -o test.o
4.链接-Linking //bin文件
// -o 选项为可执行文件指定文件名
g++ test.o -o test
2.g++重要编译参数
1. -g 编译带调试信息的可执行文件
// -g 选项告诉 GCC 产生能被 GNU 调试器GDB使用的调试信息
//产生可执行文件test
g++ -g test.cpp -o test
2. -O[n] 优化源代码
// -O0 表示不优化
// -O1 默认优化
// -O2 处理完成-O1的优化外,还进行了额外的调整,如指令调整
// -O3 包括循环展开和其他一些与处理特性相关的优化
g++ -O2 test.cpp
3. -l (L的小写)指定库文件
-L 指定库文件路径
//-l跟库名,中间无空格
//在/lib和/usr/lib和/usr/local/lib里的库直接用-l就能链接
//链接logo库
g++ -llogo test.cpp
//如果文件没有放在以上三个目录下,则需要-L(中间无空格)跟库文件路径
//链接mylogo库,libmylogo路径为/home/zzzz/mylogolibfolder
g++ -L/home/zzzz/mylogolibfolder -lmylogo test.cpp
4. -I(i的大写)
// /usr/include 目录一般不用指定,但是如果头文件不再此目录中,就需要 -I 指定头文件目录
// eg:头文件在myinclude目录里则需要
g++ -I/myinclude test.cpp
5. -Wall 打印警告信息
g++ -Wall test.cpp
6. -w 关闭警告信息
g++ -w test.cpp
7. -std=c++11 设置编译标准
//使用c++11 标准编译 test.cpp
g++ -std=c++11 test.cpp
8. -o 指定输出文件名
//当生成可执行文件时不加 -o 选项,则默认生成a.out
g++ test.cpp -o test
9. -D 定义宏
//常用场景 :-DDEBUG定义DEBUG宏,可能文件中有DEBUG宏部分相关信息,用这个DDEBUG来选择开启或关闭DEBUG
//eg:
#include<stdio.h>
int main(){
#ifdef DEBUG
printf("DEBUG LOG\n");
#endif
printf("in\n");
}
//1.在编译时,使用g++ -DDEBUG main.cpp
//2.第七行代码可以被执行
注:使用man gcc 查看 查看gcc的英文使用手册
3. 实战 g++命令编译
1.准备案例
在你的用户下创建GCC_DEMO_swap文件夹,如图
在文件夹中分别常见include文件夹,main.cpp,src文件夹,如图
在include目录下创建swap.h
在src目录下创建swap.cpp来实现swap函数
最后在写main.cpp
在GCC_DEMO_swap目录下输入tree .查看文件
2.开始实战 g++命令编译
2.1 直接编译,并运行
//将main.cpp src/swap.cpp 编译成可执行文件
//-Iinclude 表示链接swap.h
g++ main.cpp src/swap.cpp -Iinclude
//运行
./a.out
2..2增加参数,并运行
//-std=c++11 表示用c++11的标准进行编译
//-O2 表示优化
//-Wall 表示开启警告信息
//-o 指定可执行文件名
g++ main.cpp src/swap.cpp -Iinclude -std=c++11 -O2 -Wall -o b.out
//运行
./b.out
2.3生成库文件并编译
链接静态库生成可执行文件
//进入src目录
//汇编,生成swap.o文件
g++ swap.cpp -c -I../include
//生成静态库libswap.a
ar rs libswap.a swap.o
//回到上级目录
//链接,生成可执行文件:static_main
g++ main.cpp -Iinclude -Lsrc -lswap -o static_main
执行完毕如图查看文件,并执行:
链接动态库生成可执行文件
//进入src目录
//生成动态库libswap.so
g++ swap.cpp -I../include -fPIC -shared -o libswap.so
//上面等于两条指令
//g++ swap.cpp -I../include -c -fPIC
//g++ -shared -o libswap.so swap.o
//回到上级目录
//链接,生成可执行文件:sharemain
g++ main.cpp -Iinclude -Lsrc -lswap -o sharemain
在运行时报错:
原因:动态库生成的可执行文件,在运行时加载,但是动态库所在的路径不在默认加载路径下,而是在src目录下
修改运行指令:LD_LIBRARY_PATH=src ./sharemain
查看当前目录结构:
Finish