您的位置:首页 > 其它

gcc/g++基本内容

2017-12-12 17:25 148 查看

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)路径包含

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

90b6

头文件路径包含

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐