每日 C++ - g++ 编译介绍

编译/链接过程

-E 选项 编译器仅对输入文件进行预处理

g++ -E test.cpp -o test.i

-S 编译选项告诉 g++ 在为 c++ 代码产生了汇编语言文件后停止编译

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

汇编

// 缺省时 g++ 建立的目标代码文件有一个 .o 的扩展名
g++ -c test.s -o test.o

链接

// 产生可执行文件 test
g++ test.o -o test

编译参数

  • -g 编译带调试信息的可执行文件
g++ test.o -o test -g
  • -O[n] 优化源代码

    1. -O0 不做优化

    2. -O1 默认优化,与 -O 等价

    3. -O2 会牺牲部分编译速度,除了执行-O1所执行的所有优化之外,还会采用几乎所有的目标配置支持的优化算法,用以提高目标代码的运行速度

    4. -O3 除了执行-O2所有的优化选项之外,一般都是采取很多向量化算法,提高代码的并行执行程度,利用现代CPU中的流水线,Cache等

    5. -Os 和-O3有异曲同工之妙,当然两者的目标不一样,-O3的目标是宁愿增加目标代码的大小,也要拼命的提高运行速度,但是这个选项是在-O2的基础之上,尽量的降低目标代码的大小,这对于存储容量很小的设备来说非常重要。
      为了降低目标代码大小,会禁用下列优化选项,一般就是压缩内存中的对齐空白(alignment padding)

      -fno-protect-parens 
      -fstack-arrays
      
    6. -Ofast 将不会严格遵循语言标准,除了启用所有的-O3优化选项之外,也会针对某些语言启用部分优化。如:-ffast-math ,对于Fortran语言,还会启用下列选项:

    7. -Og 会精心挑选部分与-g选项不冲突的优化选项,能提供合理的优化水平,同时产生较好的可调试信息和对语言标准的遵循程度

链接参数

  • -l (L 小写)紧跟链接库的名称

    linux 下 /lib /usr/lib /usr/local/lib 的库直接用 -l 就能链接

  • -L 后紧跟链接库所在目录的名称

    如果库文件没在默认目录中,可以指定库目录

其它参数

  • -Wall 打印告警信息

  • -w 关闭告警信息

  • -std=c++11 设置c++编译标准

  • -o 指定输出文件名

  • -D 定义宏

    -DDEBUG -> 开启 DEBUG 宏
    
  • -I(i 大写) 指定头文件的搜索目录

    /usr/include 目录一般不用指定,如果头文件不在 /usr/include 下,需要 -I 指定头文件搜索目录

上手编译

直接编译生成

目录结构如下:

.
├── bin
├── build
│   └── build_src.sh
├── include
│   └── calc.h
├── lib
├── src
│   ├── calc.cpp
│   └── main.cpp
└── test

calc.h

#ifndef __CALC_H__
#define __CALC_H__

class Calc
{
public:
    int add(int a, int b);
    int sub(int a, int b);
};

#endif // __CALC_H__

calc.cpp

#include <calc.h>
#include <iostream>

int Calc::add(int a, int b)
{
    std::cout << "sum = " << a + b << std::endl;
    return a + b;
}

int Calc::sub(int a, int b)
{
    std::cout << "sub = " << a - b << std::endl;
    return a - b;
}

main.cpp

#include <iostream>
#include "calc.h"

int main()
{
    Calc c;
    c.add(1, 2);
    c.sub(2, 1);
    std::cout << "This is a c++ test application." << std::endl;
    return 0;
}

执行编译命令

g++ ./src/calc.cpp ./src/main.cpp -o ./bin/test -I./include

我们生成了 test 的可执行程序

通过链接 calc 库生成

链接 calc 动态库生成

生成动态库

g++ ./src/calc.cpp -I./include -fPIC -shared -o ./lib/libCalc.so

链接动态库,生成可执行文件

g++ ./src/main.cpp -I./include -L./lib -lCalc -o ./bin/test_lib_dynamic

执行 ./bin/test_lib_dynamic

xxx/Test# export LD_LIBRARY_PATH=./lib;./bin/test_lib_dynamic
sum = 3
sub = 1
This is a c++ test application.
链接 calc 静态库生成

生成静态库

g++ -c ./src/calc.cpp -I./include -o ./lib/calc.o
ar rs ./lib/libCalc.a ./lib/calc.o

链接静态库,生成可执行文件

g++ ./src/main.cpp -I./include -L./lib -lCalc -o ./bin/test_lib_static

执行 ./bin/test_lib_static

xxx/Test# ./bin/test_lib_static
sum = 3
sub = 1
This is a c++ test application.

主要介绍了 g++ 的编译/链接过程,以及如何去编译和链接动态库和静态。

祝愉快!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值