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
相关文章推荐
- gcc/g++基本命令
- Linux下静态库_库的基本概念;如何生成静态库动态库;nm查看库中包含那些函数、ar生成静态库,查看库中包含那些.o文件、ldd查看程序依赖的.so文件;gcc/g++与库相关的参数-L,-l,-f
- gcc/g++基本命令简介
- Linux下静态库_库的基本概念;如何生成静态库动态库;nm查看库中包含那些函数、ar生成静态库,查看库中包含那些.o文件、ldd查看程序依赖的.so文件;gcc/g++与库相关的参数-L,-l,-f
- gcc/g++基本命令简介
- gcc/g++基本命令简介
- Linux下静态库_库的基本概念;如何生成静态库动态库;nm查看库中包含那些函数、ar生成静态库,查看库中包含那些.o文件、ldd查看程序依赖的.so文件;gcc/g++与库相关的参数-L,-l,-f
- gcc/g++基本命令简介
- Linux下静态库_库的基本概念;如何生成静态库动态库;nm查看库中包含那些函数、ar生成静态库,查看库中包含那些.o文件、ldd查看程序依赖的.so文件;gcc/g++与库相关的参数-L,-l,-f
- gcc/g++基本命令简介
- Linux下静态库_库的基本概念;如何生成静态库动态库;nm查看库中包含那些函数、ar生成静态库,查看库中包含那些.o文件、ldd查看程序依赖的.so文件;gcc/g++与库相关的参数-L,-l,-f
- Linux下静态库_库的基本概念;如何生成静态库动态库;nm查看库中包含那些函数、ar生成静态库,查看库中包含那些.o文件、ldd查看程序依赖的.so文件;gcc/g++与库相关的参数-L,-l,-f
- gcc/g++基本命令简介
- gcc/g++基本命令简介
- c/c++ 数据结构与算法概念 (研究内容&基本概念&术语)
- SQL Server 获取表的基本信息、字段列表、存储过程内容及参数列表
- Mongodb学习(2)概念学习——基本内容
- 变换gcc/g++版本的方法
- DIV+CSS布局最基本的内容
- IO流一些基本内容(日后补充)