专栏首页恩蓝脚本Ubuntu环境下使用G++编译CPP文件

Ubuntu环境下使用G++编译CPP文件

第一次用g++编译cpp文件的时候报了undefined reference的错误,自定义类中的函数全部都无法找到,查找资料后发现调用的类是需要链接的,本文以一个小例子描述编译的过程。其中class2类调用了class1类的成员函数,依赖于class1类,而test文件调用了class2类的成员函数,依赖于class1类。

//class1.h
#ifndef _CLASS1_H
#define _CLASS1_H
class class1
{
public:
  int f(int i);
};
#endif
//class1.cpp
#include<iostream>
#include "class1.h"
using namespace std;
int class1::f(int i)
{
  if (i==0 || i==1)
   return 1;
  else
   return f(i-1)+f(i-1);
}
//class2.h
#ifndef _CLASS2_H
#define _CLASS2_H
#include "class1.h"
class class2
{
public:
  int double_f(int i);
};
#endif
//class2.cpp
#include<iostream>
#include "class2.h"
using namespace std;
int class2::double_f(int i)
{
  class1 c;
  return 2*c.f(i);
}
//test.cpp
#include<iostream>
#include "class2.h"
using namespace std;
int main()
{
  class2 c2;
  cout << c2.double_f(4) <<endl;
  return 0;
}

先把类class1和类class2以及test文件编译成.o格式的文件

g++ -c class1.cpp
g++ -c class2.cpp
g++ -c test.cpp

由于class1和class2是被依赖的,需要打包成静态库文件(.a格式)用于链接

ar -rc class1.a class1.o
ar -rc class2.a class2.o

最后一步就是将test.o链接成可执行文件

g++ -o test test.o class2.a class1.a

执行后得到可执行文件test,使用./test指令就可以执行。这里注意链接时静态链接库的顺序,必要保证前面的依赖后面的的顺序,如这里test依赖class2,class2依赖class1,则链接时test需要写在calss2前,class2需要写在class1,前,否则就会有undefined reference的错误。

g++同时编译多个文件的方法

对于这个例子,文件被放置在/CPPPFrtory目录中。使用CD命令进入包含源文件的文件夹。 通过在命令行上列出文件来编译程序,类型:

方法一:g++ Hello.cpp Welcome2.cpp -o Welcome2.out -ansi //两个cpp源文件,编译后只生成一个 .out 文件 方法二:使用“通配符”编译程序,类型:g++ *.cpp -o Welcome2.out -ansi //用*号代替目录下所有要编译的文件

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对ZaLou.Cn的支持。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • android端使用openCV实现车牌检测

    现在,汽车的踪影无处不在,公路上疾驰,大街边临停,小区中停靠,车库里停泊。管理监控如此庞大数量的汽车是个头疼的问题。精明的人们把目光放在车牌上,因为车牌是汽车的...

    砸漏
  • 浅谈python脚本设置运行参数的方法

    正在学习Django框架,在运行manage.py的时候需要给它设置要监听的端口,就是给这个脚本一个运行参数。教学视频中,是在Eclipse中设置的运行参数,网...

    砸漏
  • Python-opencv实现红绿两色识别操作

    为了较准确的调红色和绿色的HSV,我使用cv2.createTrackbar()函数创建了六个滚动条

    砸漏
  • 逃逸安全的模板沙箱(一)——FreeMarker(上)

    作者:DEADF1SH_CAT@知道创宇404实验室 时间:2020年8月24日

    Seebug漏洞平台
  • 培养敏捷态度

    关于敏捷方法论的文章已经很多了。其中,相当一部分文章讲述了敏捷方法技术方面的问题,比如测试驱动开发和持续集成。同样,还有相当一部分文章讨论了敏捷 方法论的应用问...

    张善友
  • 关于翻转课堂(不时更新)

    Y大宽
  • 一次帮助云上客户 JVM 调优的记录

    年前帮一个网约车客户的系统做了次 JVM 参数调优,优化后的GC性能有较大提升,GC 次数和耗时都降了超 33%。优化无止境,对于文中的部分参数虽然可以更激进些...

    鲍远林
  • Python-opencv实现红绿两色识别操作

    为了较准确的调红色和绿色的HSV,我使用cv2.createTrackbar()函数创建了六个滚动条

    砸漏
  • django queryset 合并

    kirin
  • 移动IM老二陌陌改版了!继续“排遣寂寞”

    中秋前有朋友给我送了一件T恤,上书“TALK TO ME”几个墨色字母,在这个寂寞的季节,走在街上虽有人侧目,但没有任何人主动 TALK TO ME,不...

    罗超频道

扫码关注云+社区

领取腾讯云代金券