gcc/g++基本使用

1.基本概念

 

 

gcc:早期是一个C编译器(GNU C Compiler);后来发展成多种语言的编译器集合(GNU Compiler Collection)。

g++:gcc编译器集合中的C++编译器。

 

 

2.编译过程

 

g++ -E main.cpp -o main.i//生成main.i;
g++ -S main.cpp -o main.s//生成main.s;(g++ -S main.i -o main.s)
g++ -c main.cpp -o main.o//生成main.o;(g++ -o main.i -o main.o)(g++ -o main.s -o main.o)
g++ main.cpp -o out//生成out可执行程序;(g++ main.i -o out)(g++ main.s -o out)(g++ main.o -o out)

 

3.常用选项

 

 

-o重定位输入文件位置;
-E只对源文件进行预处理,输出.i文件;
-S对源文件进行预处理,编译,输出.s文件;
-c对源文件进行预处理,编译,汇编,输出.o文件;
-I包含头文件路径,如 g++ -Iopencv/include/;
-L包含库文件路径,如 g++ -Lopencv/lib/ ;
-l链接库文件,如链接lib.so:g++ -llib;
-shared编译.so库;
-fPIC生成位置无法码;
-Wall对代码有问题的地方发出警告;
-g在目标文件中嵌入调试信息,便于gdb调试;

 

4.多个文件编译

 

类1:tea

 

//tea.h
#include <iostream>

class tea
{
public:
    tea();
    ~tea();

    virtual void print_name();
    virtual void print_type();

protected:
    const char *m_name;
};

 

 

//tea.cpp
tea::tea()
{
    m_name = "tea";
}

tea::~tea()
{

}

void tea::print_name()
{
    std::cout<< m_name<< std::endl;
}

void tea::print_type()
{
    std::cout<< "all type"<< std::endl;
}

 

类2:dragon_well_tea

 

//dragon_well_tea.h
#include "tea.h"

class dragon_well_tea : public tea
{
public:
   dragon_well_tea()
   {
       m_name = "dragon well tea";
   };
   ~dragon_well_tea(){};

   void print_type();
};

 

//dragon_well_tea.cpp
#include "dragon_well_tea.h"

void dragon_well_tea::print_type()
{
    std::cout<< "grean tea"<< std::endl;
}

主函数

 

//main.cpp
#include "dragon_well_tea.h"

int main(int argc, char **argv)
{
    std::cout<< "Hello, World!" << std::endl;

    tea *p = new dragon_well_tea();
    p->print_name();
    p->print_type();
}

 

 

(1)可以直接编译多个cpp文件,生成可执行文件

 

 

g++ main.cpp tea.cpp dragon_well_tea.cpp -o out

(2)为了提升效率,通常先把各个cpp文件单独编译成.o文件,然后链接成可执行文件。当有的文件改动时,只需要重新编译改动过的文件。

 

 

5.静态库生成及使用

(1)生成静态库

 

ar -r libtea.a dragon_well_tea.o tea.o
//-r表示如果libtea.a不存在,则创建libtea.a文件,否则覆盖libtea.a文件;
//需要先编译cpp文件生成.o中间文件,然后把中间文件链接入库;

 

(2)静态库使用

g++ main.cpp libtea.a

 

 

(3)路径包含

上面的情况是所有源文件在同一个目录下的,当工程稍微大一点,目录就会分化,还会用到很多第三方的库,所以就需要进行路径包含;

 

头文件路径包含

 

g++ -Itea main2.cpp tea/libtea.a  
//-I为头文件路径包含选项,后跟路径tea。路径可以是相对路径,也可以是绝对路径;

库文件路径包含

 

g++ -Itea main2.cpp tea/libtea.a  //直接索引的方式;

g++ -Itea main2.cpp -Ltea -ltea   
//-L为库文件路径包含选项,后跟路径tea。可以是相对路径,也可以是绝对路径;
//-ltea表示libtea.a,去掉头lib,尾.a;

6.动态库生成及使用

(1)动态库生成

g++ -shared -fPIC tea.cpp dragon.cpp -o libtea.so
//-shared生成共享库选项,-fPIC生成位置无关码(参考)
//如果不是通过cpp文件直接编译生成.so的,而是先生成.o文件的,再由.o链接成.so库,那么生成.o文件时也需要加上-fPIC选项,否则链接时报错;

 

(2)动态库使用

g++ -Itea main2.cpp tea/libtea.so  
//直接索引的方式,可执行文件与库文件的路径关系固定;

g++ -Itea main2.cpp -Ltea -ltea   
//需要设置环境变量(export LD_LIBRARY_PATH=tea),因为这是系统全局的,别的程序也需要用时,可能冲突;

g++ -Itea main2.cpp -Ltea -Wl,rpath=tea -ltea 
//-Wl表示,-rpath选项的参数是传给链接器的

7.gcc与g++的区别

g++:编译过程与gcc一样;g++链接的是c++的中间文件及库文件。

//例:
gcc -c main.cpp 
g++ -c main.cpp
//以上两条指令功能一样,生成main.o中间文件。

gcc main.o dragon_well_tea.o tea.o //链接错误;
g++ main.o dragon_well_tea.o tea.o //链接成功;

8.C++11编译

g++ -Itea -std=c++11 main.cpp tea/libtea.so

//可以在系统中定义别名   
alias g++="g++ -std=c++11"
g++ -Itea main.cpp tea/libtea.so

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乘风-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值