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 //用*号代替目录下所有要编译的文件

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。如果你想了解更多相关内容请查看下面相关链接

(0)

相关推荐

  • foreman ubuntu16 快速安装

    Quickstart Guide The Foreman installer is a collection of Puppet modules that installs everything required for a full working Foreman setup. It uses native OS packaging (e.g. RPM and .deb packages) and adds necessary configuration for the complete in

  • Ubuntu中支持PHP5与PHP7双版本的简单实现

    前言 最近在编写一个工具的时候,使用了PHP命名空间特性,在命名空间中如果想引用常量.函数,需要PHP5.6以上的版本,但我阿里云 ECS 上安装的版本是PHP 5.5.9,由于 ECS 部署了很多PHP代码,如果贸然升级高版本PHP,可能会存在一些兼容性的问题.突然奇想,在同一个操作系统中,是否能够同时支持两个版本的PHP呢? 简单查阅了相关资料,其实在 Ubuntu 中使用包安装方式支持PHP双版本非常简单,两个版本存在能够互不干扰,接下去简单做下介绍,其实相关文章很多. 1:获取PHP7源

  • Ubuntu下VIM配置成C++开发编辑器

    1.复制配置文件到本用户环境下,再新建一个.vim文件夹,并创建bundle子文件夹 sudo cp /etc/vim/vimrc /home/wangy/.vimrc sudo mkdir /home/wangy/.vim sudo mkdir /home/wangy/.vim/bundle sudo mkdir /home/wangy/.vim/bundle/vundle bundle的配置文件如下: "新增的配置放在这里 set nocompatible " be iMprove

  • 开发环境Ubuntu16安装以后的初始化设置

    办公室需要ubuntu系统作为linux开发环境,目前大家用的多的是ubuntu16.04.所以这里也以ubuntu16.4作为办公开发环境来进行一些初始化. 打开命令行 ubuntu16.04版本 右键--打开终端 有的Ubuntu 14.04没有自带右键打开终端功能,用起来非常不方便.今天偶尔想起来,网上搜了一下,方法如下: $ sudo apt-get install nautilus-open-terminal 注销系统重新登录,即可. 设置root用户密码 ubuntu默认root密码

  • Ubuntu 16.04设置PostgreSQL开机启动的方法

    由于PostgreSQL是编译安装的,需要设置开机启动.对于Ubuntu系统来说,和Red Hat之类的系统稍微有一点不一样. 首先第一步,由于我们习惯于使用Red Hat这样的系统,所以我们需要弄一个chkconfig出来.这个命令是配置Red Hat服务启动停止的命令,但是在Ubuntu上没有.我们可以使用sysv-rc-conf. sudo apt install sysv-rc-conf 安装完成sysv-rc-conf之后,我们把他换成chkconfig.毕竟这个命令太难记住了. su

  • Ubuntu16.04源码安装Mininet

    Mininet Mininet 是一个轻量级软件定义网络和测试平台:它采用轻量级的虚拟化技术使一个单一的系统看起来像一个完整的网络运行相关的内核系统和用户代码,也可简单理解为 SDN 网络系统中的一种基于进程虚拟化平台,它支持 OpenFlow.OpenvSwith 等各种协议,Mininet 也可以模拟一个完整的网络主机.链接和交换机在同一台计算机上且有助于互动开发.测试和演示,尤其是那些使用 OpenFlow 和 SDN 技术:同时也可将此进程虚拟化的平台下代码迁移到真实的环境中. Mini

  • Ubuntu18下安装Nvidia驱动解决黑屏并调整分辨率问题

    Ubuntu自带的显卡驱动Nouveau会与N卡冲突,导致卡机黑屏,而禁用后分辨率又过低 1.禁用Nouveau显卡驱动 在进入grub启动界面时,10秒内使用↑↓键选中Ubuntu,按e键进行编辑,在倒数第二行quiet slash后添加acpi_osi=linux nomodeset quiet slash acpi_osi=linux nomodeset 该方法只是暂时禁用Nouveau显卡驱动,在进入桌面后需要在grub的配置文件里面更改已使得其永久有效,在命令行中输入如下命令: $ s

  • Ubuntu终端多窗口分屏Terminator

    1.安装 Terminator最大的特点就是可以在一个窗口中打开多个终端 sudo apt-get install terminator 2.快捷键 Ctrl+Shift+E    垂直分割窗口 Ctrl+Shift+O    水平分割窗口 F11               全屏 Ctrl+Shift+C    复制 Ctrl+Shift+V    粘贴 Ctrl+Shift+N    或者 Ctrl+Tab 在分割的各窗口之间切换 Ctrl+Shift+X    将分割的某一个窗口放大至全屏

  • Ubuntu16.04.4LTS安装mininet遇到的问题及解决方案

    Mininet Mininet 是一个轻量级软件定义网络和测试平台:它采用轻量级的虚拟化技术使一个单一的系统看起来像一个完整的网络运行相关的内核系统和用户代码,也可简单理解为 SDN 网络系统中的一种基于进程虚拟化平台,它支持 OpenFlow.OpenvSwith 等各种协议,Mininet 也可以模拟一个完整的网络主机.链接和交换机在同一台计算机上且有助于互动开发.测试和演示,尤其是那些使用 OpenFlow 和 SDN 技术:同时也可将此进程虚拟化的平台下代码迁移到真实的环境中. 下列图片

  • ubuntu16.04制作vim和python3的开发环境

    1. 安装vim: # apt-get install  -y vim-gnome 2. 安装ctags,ctags用于支持taglist # apt-get install ctags 3. 安装taglist # apt-get install vim-scripts vim-addon-manager # vim-addons install taglist 4. 安装pydiction 实现代码补全: #wget  https://www.vim.org/scripts/script.p

  • 在Ubuntu Linux上安装和使用Git和GitHub

    Git的简介 Git是2005年Linus Torvalds 为了帮助管理 Linux(R) 内核开发而开发的一个开放源码的版本控制软件,正如所提供的文档中说的一样: Git 是一个快速.可扩展的分布式版本控制系统,它具有极为丰富的命令集,对内部系统提供了高级操作和完全访问. Github是一个存放着世界上最棒的一些软件项目的宝藏,这些软件项目由全世界的开发者无私贡献.这个看似简单,实则非常强大的平台因为大大帮助了那些对开发大规模软件感兴趣的开发者而被开源社区所称道. 这篇向导是对于安装和使用G

随机推荐