美文网首页
利用makefile文件编译c++源文件

利用makefile文件编译c++源文件

作者: rewq123 | 来源:发表于2018-07-12 15:19 被阅读47次

阅读全文请点击

一、基础知识介绍 

在Linux下,要想编译c++项目,并生成可执行文件,需要使用到makefile文件。 

c++从代码到可执行文件,经历了编译和链接两阶段。

编译阶段:编译时,编译器检查语法、函数的申明等是否正确。对于函数申明,一般是你需要告诉编译器头文件的所在位置。如果所有的检查都正确,编译器就可以编译出相应的中间文件(即.o文件)。一般来说,每个源文件都应该对应于一个.o文件。链接阶段:根据编译结果(即.o文件)生成可执行文件。

如下图所示: 

这里写图片描述

注意:在Linux下,可以通过“ldd 可执行文件名” 查看编译链接此可执行文件时,用到了那些系统库。

二、编写makefile文件

#定义变量,使用变量:$(变量名)CC=g++#定义变量srcs,表示需要编译的源文件,需要表明路径,如果直接写表示这些cpp文件和makefile在同一个目录下,如果有多个源文件,每行以\结尾SRCS=main.cpp\        udp.cpp#定义变量OBJS,表示将原文件中所有以.cpp结尾的文件替换成以.o结尾,即将.cpp源文件编译成.o文件OBJS=$(SRCS:.cpp=.o)#定义变量,表示最终生成的可执行文件名EXEC=maincpp#start,表示开始执行,冒号后面的$(OBJS)表示要生成最终可执行文件,需要依赖那些.o文件的start:$(OBJS)#相当于执行:g++ -o maincpp .o文件列表,-o表示生成的目标文件$(CC) -o $(EXEC) $(OBJS)#表示我的.o文件来自于.cpp文件.cpp.o:#如果在依赖关系中,有多个需要编译的.cpp文件,那么这个语句就需要执行多次。-c $<指的是需要编译的.cpp文件,-o $@指这个cpp文件编译后的中间文件名。比如在依赖关系中,有a.cpp和b.cpp,即$(OBJS)的值为a.cpp b.cpp,那么这条语句需要执行2次,第一次的$@为a.o,$<为a.cpp,第二次的$@为b.o,$<为b.cpp。-c表示只编译不链接,-o表示生成的目标文件#-DMYLINUX:-D为参数,MYLINUX为在cpp源文件中定义的宏名称,如#ifdef MYLINUX。注意-D和宏名称中间没有空格$(CC) -o $@ -c $< -DMYLINUX#执行make clean指令clean:#执行make clean指令时,需要执行的操作,比如下面的指令时指删除所有.o文件rm -rf \$(OBJS)

注意:上述文件中的cpp文件表示是c++源文件,如果是c源文件,一般文件名为”文件名.c“,如果要利用上述makefile文件编译链接c源文件,只需要将上述makefile文件中的cpp修改成c,g++修改成gcc即可。

上述makefile文件配置中,如果某个cpp文件被修改过,那么在执行make时,将会只编译修改过的cpp文件,但链接时,还是需要用到所有的.o中间文件。

三、生成一个so库文件 

比如,我们在实际开发过程中,写了一个公共的功能,那么这个公共的功能如何在所有需要用到的项目中使用,一般有两种方式,一种是源码共享,即将源码提供给使用方;另外一种是提供一个类似于Linux提供的库文件的so文件。这里我们就来用C语言编写并生成一个so库文件。 

假如我们需要打包成库文件的源码为mylib.c,里面提供了一个比较大小的函数,如下所示:

mylib.c:intmax(intx,inty){if(x>y){returnx;    }returny;}

修改makefile文件:

#c编译器,g++是c++的编译器CC=gcc#假设我们的源文件名为mylib.c的c语音编写的SRCS=mylib.cOBJS=$(SRCS:.c=.o)#这里的命名有一个规则,以lib开头,以.so结尾,必须这样EXEC=libmylib.sostart:$(OBJS)#-shared表示最终链接成so共享文件$(CC) -o $(EXEC) $(OBJS) -shared.c.o:#-fPIC表在编译时生成和位置无关的代码$(CC) -o $@ -c $< -fPICclean:rm -rf $(OBJS)

相关文章

  • java_类的加载、链接、初始化

    makefile C/C++ 的makefile 处理的是编译,链接的过程,手下是将源文件编译成中间文件 .o文...

  • 利用makefile文件编译c++源文件

    阅读全文请点击 一、基础知识介绍 在Linux下,要想编译c++项目,并生成可执行文件,需要使用到makefile...

  • Linux Makefile文件模板

    1、编译驱动的Makefile文件模板: 2、编译c/c++文件的Makefile文件模板: 3、带文件夹的文件模...

  • NDK Makefile 找不到源文件,编译报错

    NDK中把源文件都添加到makefile中了结果编译时报以下错误 反复排查,makefile文件添加的正确,路径什...

  • Makefile文件的编写

    makefile文件:makefile关系到了整个工程的编译规则。一个工程中的源文件不计数,其按类型、功能、模块分...

  • C高级makefile使用

    C高级技术 makefile使用 编译工具GCC源文件(.c)--->预处理(.i)--->汇编(.s)--->目...

  • C/C++编译模型

    C/C++是以源文件为单位进行编译的,每个源文件依次要经过预编译,编译,汇编,链接最终生成可执行文件或者库文件。 ...

  • android.mk 与 makefile文件的区别

    makefile文件控制整个工程的编译规则,比如指定需要生成哪些目标文件,指明生成这些目标文件依赖哪些源文件,指明...

  • sublime-text 环境配置(持续更新)

    C++、C 环境配置 Attention 以下皆为单文件编译运行,多文件联合需要 makefile(后续更新) 插...

  • C++详解预处理

    C/C++编译系统编译程序的过程为预处理、编译、链接。预处理器是在程序源文件被编译之前根据预处理指令对程序源文件进...

网友评论

      本文标题:利用makefile文件编译c++源文件

      本文链接:https://www.haomeiwen.com/subject/dnhrpftx.html