g++多文件编译和简单MakeFile文件写法

原创 2013年12月02日 16:05:18
         上文(g++基本用法)介绍简单的g++编译器的用法,只是针对没有依赖关系的单个文件的操作,当我们有多个文件需要编译的时候,是如何工作的呢?下面以简单的实例进行介绍,然后把实例以MakeFile文件实现,并对MakeFile文件进行简单介绍。



     准备工作,下面是需要的简单实例文件及代码:

  main.cxx  

Administrator@72cec870236147e /home/liujl/mytest
$ cat main.cxx
#include <iostream>
#include "printf1.hxx"
#include "printf2.hxx"
Administrator@72cec870236147e /home/liujl/mytest
$ g++ -c main.cxx

Administrator@72cec870236147e /home/liujl/mytest
$ g++ -c  printf1.cxx

Administrator@72cec870236147e /home/liujl/mytest
$ g++ -c printf2.cxx

int main(){ printf1(); printf2();}
printf1.hxx
Administrator@72cec870236147e /home/liujl/mytest
$ cat printf1.hxx
#ifndef _PRINTF_1_H_
#define _PRINTF_1_H_

void printf1();

#endif
printf1.cxx
Administrator@72cec870236147e /home/liujl/mytest
$ cat printf1.cxx
#include "printf1.hxx"
#include <iostream>

using namespace std;

void printf1()
{
        cout<<"printf1"<<endl;
}
printf2.hxx
Administrator@72cec870236147e /home/liujl/mytest
$ cat printf2.hxx
#ifndef _PRINTF_2_H_
#define _PRINTF_2_H_

void printf2();

#endif
printf2.cxx
Administrator@72cec870236147e /home/liujl/mytest
$ cat printf2.cxx
#include "printf2.hxx"
#include <iostream>

using namespace std;

void printf2()
{
        cout<<"printf2"<<endl;
}
共计5个文件,3cxx文件,2hxx头文件

1、手动多文件编译

先分别直接汇编(编译)为.o文件

Administrator@72cec870236147e /home/liujl/mytest
$ g++ -c main.cxx

Administrator@72cec870236147e /home/liujl/mytest
$ g++ -c printf1.cxx

Administrator@72cec870236147e /home/liujl/mytest
$ g++ -c printf2.cxx

②链接阶段

如果直接执行

Administrator@72cec870236147e /home/liujl/mytest
$ g++ main.cxx -o main
/tmp/cc9LFDvP.o:main.cxx:(.text+0xc): undefined reference to `printf1()'
/tmp/cc9LFDvP.o:main.cxx:(.text+0x11): undefined reference to `printf2()'
collect2: ld 返回 1
出现上边错误,原因是编译器找不到printf1()printf2()的定义。

所以需要将3obj文件链接到一个文件上:

Administrator@72cec870236147e /home/liujl/mytest
$ g++ main.cxx printf1.cxx printf2.cxx -o main

Administrator@72cec870236147e /home/liujl/mytest
$ ./main
printf1
printf2
并输出结果。

这样就能解决多文件编译问题,但是一般情况下,一个项目下的文件比较多,如果这样输入,比较费劲,所以就需要把编译过程写进一个MakeFile文件中

Administrator@72cec870236147e /home/liujl/mytest
$ cat makefile
cc=g++
exe=main
obj=main.o printf1.o printf2.o

$(exe):$(obj)
        $(cc) -o $(exe) $(obj)
main.o:main.cxx
        $(cc) -c main.cxx
printf1.o:printf1.cxx
        $(cc) -c printf1.cxx
printf2.o:printf2.cxx
        $(cc) -c printf2.cxx
clean:
        rm -rf *.o main
其中
cc=g++
exe=main
obj=main.o printf1.o printf2.o
为变量的定义,$(...)作为引用,可以分析一下,是不是和上文中单个操作效果一样?

执行过程:

Administrator@72cec870236147e /home/liujl/mytest
$ make
g++ -c main.cxx
g++ -c printf1.cxx
g++ -c printf2.cxx
g++ -o main main.o printf1.o printf2.o





makefile可以参考:

1ASimple Makefile Tutorial

2中文makefile教程


编译基础——如何用g++编译自己的库,以及一个简单的makefile文件

如何生成自己的库,如何使用库,如何写自己的makefile

makefile编译C++程序 gcc/g++区别

一个简单的C++程序和makefile文件,在执行make时候报错,下面是详细信息: 下面是hello.cpp文件内容 #include using namespace std; int main(...
  • mzbonnt
  • mzbonnt
  • 2016年04月21日 18:03
  • 4472

Linux下开发环境(gcc/g++/makefile/gdb)

先决条件 gcc 这是c语言的编译器 从前,我写了一个Linux多线程到程序Main.c,使用gcc -g Main.c -lpthread -o Main编译,就出现来未安装gcc的提示,我按照提...

gcc/g++ 以及makefile

fpic:产生位置无关码 解释一下,位置无关码就是可以在进程的任意内存位置执行的目标码,动态链接库必须使用...

g++编译命令选项

gcc & g++现在是gnu中最主要和最流行的c & c++编译器 。 g++是c++的命令,以.cpp为主,对于c语言后缀名一般为.c。这时候命令换做gcc即可。其实是无关紧要的。 其实编译器是根...
  • woshinia
  • woshinia
  • 2013年09月04日 15:14
  • 56670

Linux 环境下使用g++编译C++

单个源文件生成可执行程序 下面是一个保存在文件 helloworld.cpp 中一个简单的 C++ 程序的代码: /* helloworld.cpp */ #include int main(in...
  • hnyzwtf
  • hnyzwtf
  • 2015年03月27日 12:06
  • 31821

Linux下G++编译第一个C++程序(Hello, world)

安装完各种环境工具之后(sudo apt install g++) 继而新建一个空白文档Helloworl.cpp,粘贴进最简单的代码: #include int main(){ co...
  • zmdsjtu
  • zmdsjtu
  • 2017年04月02日 17:06
  • 1910

[C/C++]Windows中配置g++编译环境最简单方法

 [C/C++]Windows中配置g++编译环境最简单方法一般而言,windows下配置g++环境有两种思路,cygnus和Mingw,这里是采用的cygnus的g++编译器,原打算翻译一下http...
  • leonsc
  • leonsc
  • 2010年08月31日 16:45
  • 15251

简谈用g++编译运行c++代码流程,以及动态库静态库的创建与使用

一 g++ 编译运行hello world1编写hello world 代码#includeusing namespace std;int main() { cout ...

g++的编译及调试

编译重命名等: g++ –c Hello.cc  编译文件,生成目标文件 Hello.o g++ Hello.o –o abc  连接 并重命名为可执行文件 abc g++ Hell...
  • zhu2695
  • zhu2695
  • 2016年05月07日 23:26
  • 1946
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:g++多文件编译和简单MakeFile文件写法
举报原因:
原因补充:

(最多只允许输入30个字)