文章目录

  • gcc 如何编译cpp文件啊
  • gcc编译C++程序
    • 多个源文件生成可执行程序
    • 源文件生成对象文件
    • 编译预处理
    • 生成汇编代码
    • 创建静态库

gcc 如何编译cpp文件啊

/* hello.c */
#include <iostream>
using namespace std;
int main()
{ cout << "hello cpp"<<endl; return 1;
}

  • gcc A.cpp

  • 他找不到一些东西啊

  • 那我链接到标准C++库看看

  • gcc A.cpp -lstdc++

  • 这样成功了哦

gcc编译C++程序

  • helloworld.cpp
#include <iostream>
int main(int argc,char *argv[])
{  std::cout << "hello, world" << std::endl;  return(0);
}
g++ helloworld.cpp
  • 编译器g++检查命令行中指定的文件的后缀名可识别其为C++文件
  • 编译器默认动作
    • 编译源代码生成object file
    • 链接对象文件和 libstdc++ 库中的函数得到可执行程序。
    • 删除对象文件

  • g++将gcc默认语言设为C++的一个特殊版本
  • 链接时它自动用 C++ 标准库而不用C标准库
  • 通过遵循源码的命名规范并指定对应库的名字
  • 用 gcc 来编译链接 C++ 程序是可行的
gcc helloworld.cpp -lstdc++ -o helloworld
  • -l (ell) 通过添加前缀 lib 和后缀 .a 将跟随它的名字变换为库的名字 libstdc++.a。而后它在标准库路径中查找该库。gcc 的编译过程和输出文件与 g++ 是完全相同的。

  • 大多数系统,GCC 安装时会安装一名为 c++ 的程序。
  • 如果被安装,它和 g++ 等同,
c++ helloworld.cpp -o helloworld

多个源文件生成可执行程序

  • 多于一个源码文件在 g++ 命令中指定,
  • 它们都将被编译并被链接成一个单一的可执行文件。
  • speak.h 的头文件;
#include <iostream>
class Speak
{  public:  void sayHello(const char *);
};
/* speak.cpp */
#include "speak.h"
void Speak::sayHello(const char *str)
{  std::cout << "Hello " << str << "\n";
}
/* hellospeak.cpp */
#include "speak.h"
int main(int argc,char *argv[])
{  Speak speak;  speak.sayHello("world");  return(0);
}
  • 将上述两个源码文件编译链接成一个单一的可执行程序:
g++ hellospeak.cpp speak.cpp -o hellospeak
  • 为什么在命令中没有提到“speak.h“该文件
  • 在“speak.cpp“中包含有”#include"speak.h"“这句代码,它的意思是搜索系统头文件目录之前将先在当前目录中搜索文件“speak.h“。而”speak.h“正在该目录中,不用再在命令中指定了)。

源文件生成对象文件

  • -c

    • 编译但不要链接,输出结果为对象文件
  • 默认名与源码名相同,其后缀为 .o。
  • 编译hellospeak.cpp 并生成hellospeak.o
g++ -c hellospeak.cpp
  • g++ 也能识别 .o 文件并将其作为输入文件传递给链接器。
  • 将编译源码文件为对象文件并将其链接成单一的可执行程序:
g++ -c hellospeak.cpp
g++ -c speak.cpp
g++ hellospeak.o speak.o -o hellospeak
  • -o 不仅仅能用来命名可执行文件。
  • 也命名编译器输出的其他文件。
  • 例如:除了中间的对象文件有不同的名字外,下列命令生将生成和上面完全相同的可执行文件:
    $ g++ -c hellospeak.cpp -o hspk1.o
    $ g++ -c speak.cpp -o hspk2.o
    $ g++ hspk1.o hspk2.o -o hellospeak

编译预处理

  • -E 使 g++ 将源代码用编译预处理器处理后不再执行其他。
g++ -E helloworld.cpp
  • helloworld.cpp 的源代码,仅仅有六行,而且该程序除了显示一行文字外什么都不做,
  • 预处理后的版本将超过 1200 行。
  • 因为头文件 iostream 被包含进来,且它又包含了其他的头文件,除此之外,还有若干个处理输入和输出的类的定义。
  • 预处理过的文件的 GCC 后缀为 .ii,它可以通过 -o 选项来生成,
$ gcc -E helloworld.cpp -o helloworld.ii

生成汇编代码

  • -S 指示编译器将程序编译成汇编语言,输出汇编语言代码而后结束
g++ -S helloworld.cpp
  • 生成的汇编语言依赖于编译器的目标平台。

创建静态库

  • 静态库是编译器生成的一系列对象文件的集合。
  • 链接一个程序时用库中的对象文件还是目录中的对象文件都是一样的。
  • 库中的成员包括普通函数,类定义,类的对象实例等等。
  • 静态库的另一个名字叫归档文件(archive),
    • 管理这种归档文件的工具叫 ar
  • 先创建两个对象模块,然后用其生成静态库。
/* say.h */
#include <iostream>
void sayhello(void);
class Say {  private:  char *string;  public:  Say(char *str)  {  string = str;  }  void sayThis(const char *str)  {  std::cout << str << " from a static library\n";  }  void sayString(void);
};
  • say.cpp
  • 要加入到静态库中的两个对象文件之一的源码。
  • 它包含 Say 类中 sayString() 函数的定义体;类 Say 的一个实例 librarysay 的声明也包含在内:
/* say.cpp */
#include "say.h"
void Say::sayString()
{  std::cout << string << "\n";
}
Say librarysay("Library instance of Say");
  • sayhello.cpp 是我们要加入到静态库中的第二个对象文件的源码。它包含函数 sayhello() 的定义:
/* sayhello.cpp */
#include "say.h"
void sayhello()
{  std::cout << "hello from a static library\n";
}
  • 将源码文件编译成对象文件,
  • 命令 ar 将其存进库中:
g++ -c sayhello.cpp
g++ -c say.cpp
ar -r libsay.a sayhello.o say.o
  • ar 配合参数 -r 创建一个新库 libsay.a 并将命令行中列出的对象文件插入。
  • 如果库不存在的话,参数 -r 将创建一个新的库,而如果库存在的话,将用新的模块替换原来的模块。

  • saymain.cpp,它调用库 libsay.a 中的代码:
/* saymain.cpp */
#include "say.h"
int main(int argc,char *argv[])
{  extern Say librarysay;  Say localsay = Say("Local instance of Say");  sayhello();  librarysay.sayThis("howdy");  librarysay.sayString();  localsay.sayString();  return(0);
}
  • 该程序可以下面的命令来编译和链接:
g++ saymain.cpp libsay.a -o saymain
  • 程序运行时,产生以下输出:
    hello from a static library
    howdy from a static library
    Library instance of SayLocal instance of Say

添加链接描述

gcc 如何编译cpp文件啊相关推荐

  1. 用gcc编译.cpp文件可能出现undefined reference to `__gxx_personality_v0'问题的解决

    用gcc编译.cpp文件时出现错误:undefined reference to `__gxx_personality_v0', 解决的办法就是通过g++来编译,就可以通过了!! 用gcc编译的话需要 ...

  2. matlab怎么跑.cpp程序,MATLAB编译cpp文件

    目的:打通MATLAB与VC之间的通道,实现用MATLAB调用VC程序,以及VC调用MATLAB程序. 上篇博客实现了将MATLAB的M文件编译成C/C++文件,exe应用程序.这篇实现MATLAB编 ...

  3. java 编译引入库_eclipse编译cpp文件,并且引用其他预编译的库

    一.项目结构 jni相关的单独放在一个文件夹内,包括 st_stereo.h,main.cpp,这个是要进行编译的文件 lib下的libSTdisp.so,libStereoblur.so,前面要编译 ...

  4. linux之让终端支持C++11/14编译cpp文件

    1  问题 我们的项目很多智能指针,但是我linux的终端肯定不支持C++11/14, 我们平时都是用的下面的命令编译c++文件 g++ -g file.cpp -o file r 如果是用c++11 ...

  5. [CentOS]CentOS下编译CPP文件时报错[undefined reference to `__gxx_personality_v0' collect2: ld]的解决办法...

    在CentOS环境下编译CPP时报出 undefined reference to `__gxx_personality_v0' collect2: ld 以上错误,调查了一下,加上参数[-lstdc ...

  6. VS Code利用CMake工具编译Cpp文件报错

    VSCode 结合CMake个mingw编译Cpp项目 参考:1 配置C++和基础 报错时工具版本 Cmake工具版本为3.18.0免安装ZIP版本 mingw为8.1.0免安装ZIP版本 Path环 ...

  7. Ubuntu编译cpp文件报错“teat.cpp:45:2: error: stray ‘\344’ in program” 解决方法

    首先参考了文章,可能是因为代码中含有中文字符/符号/空格,需要找出并更改 但是很多文章都没有写怎么找到这个中文字符 实际在命令行终端报错是已经给提示了: 就是在原cpp文件的第45行有非法字符,去找到 ...

  8. linux编译cpp文件命令,Jsoncpp Linux 下编译为 .a 文件

    1 下载 jsoncpp 路径如下: https://github.com/open-source-parsers/jsoncpp 2. 解压文件 unzip jsoncpp-master.zip 3 ...

  9. Linux 的GCC的编译过程及方式

    GCC的使用 文章目录 GCC的使用 前言 一.编译过程分析 二.Linux中的编译链接 1.1 预编译阶段 1.2 编译阶段 1.3 汇编阶段 1.4 链接阶段 1.5 补充 二.编译链接命令 三. ...

  10. ubuntu下c++编译cpp(包含自定义类的多级调用)

    全栈工程师开发手册 (作者:栾鹏) 数据架构师全解  第一次用g++编译cpp文件的时候报了undefined reference的错误,自定义类中的函数全部都无法找到,查找资料后发现调用的类是需要链 ...

最新文章

  1. 开发 自我介绍_对于开发者来说,自我是敌人
  2. linux搜索含多个字符串,关于linux:使用grep搜索多个字符串
  3. BZOJ2424 [HAOI2010]订货
  4. keyphrase抽取论文在聊什么?
  5. Kubernetes学习笔记 黑马程序员
  6. android阿里图标库,Android Stdio调用阿里图标库
  7. wifi连接过程抓包
  8. 服务器不稳定是什么意思
  9. 银行客户用户画像_客户分类、客户标签与用户画像,怎样助力转化?
  10. Python.习题六 字典与集合(下)
  11. douban movie top of Web Crawler
  12. 怎么自定义服务器的404,如何自定义404页面
  13. pytorch之深度神经网络概念全面整理
  14. 编程匠艺:编写卓越的代码(第二版
  15. linux下ddos软件,Linux 系统下ddos软件Zarp安装测试
  16. 如何下载北新桥街道卫星地图高清版大图
  17. 电机与电力拖动控制系统第一次总结(包含绪论及变压器部分)
  18. ***是怎样改变世界的!!
  19. 制作打怪小游戏Kill Bill
  20. 产品之SMART原则

热门文章

  1. 视频教程-C#多层架构项目实战房屋中介管理系统-C#
  2. WhatsApp选择了便利而不是隐私,这是解决问题的方法
  3. 实用的网站、工具(科研学术、wps、作图、教程和文档、在线开发工具、在线编程学习、文档笔记工具、办公工具、写作、设计制作类、素材库)
  4. Codesys + BeagleBone PLC控制达到小儿科水平
  5. 【面试分享】奇安信渗透测试工程师,通过!
  6. 华为手机助手上架流程_华为手机助手导入音乐文件在哪里看 详细步骤介绍
  7. pyCharm最新2018.2激活 附激活文件/教育版免费使用
  8. 自助取号机应用-排队叫号机优势介绍
  9. 计算机考研专业课408什么意思,考研408是什么意思
  10. 元素周期表排列的规律_元素周期表的元素排列规律和元素的性质