当前位置: 首页 > news >正文

Linux:编写编译脚本Makefile文件

一、生成可执行文件

1、一个源文件编译
本例子主要区别.c及.cpp文件及编译该文件时使用的编译链。
1).c文件

// testadd.c
#include <stdio.h>
int main() {int a = 1;int b = 2;int sum = a + b;printf("sum = %d\n", sum);return 0;
}// Makefie
GXX = g++
CC = gcc
TARGET = testadd
OBJS = testadd.otestadd:${OBJS}${CC } ${OBJS} -o ${TARGET} # 空格处为一个Tap
testadd.o:testadd.c
clean:rm -r ${OBJS} ${TARGET} # 空格处为一个Tap

2) .cpp文件

// testadd.cpp#include <stdio.h>
//#include <iostream>
int main() {int a = 1;int b = 2;int sum = a + b;printf("c sum = %d\n", sum);//std::cout <<"c ++ sum = " << sum<<std::endl;return 0;
}// Makefile
GXX = g++
CC = gcc
TARGET = testadd
OBJS = testadd.otestadd:${OBJS}${GXX} ${OBJS} -o ${TARGET} # 空格处为一个Tap
testadd.o:testadd.cpp
clean:rm -r ${OBJS} ${TARGET} # 空格处为一个Tap

经过以上测试,总结如下:
以.cpp为后缀的文件,为c++代码。代码最好使用C++语言。也可以使用c语言。
a 代码使用c++语言,编译时必须要用g++,不能使用gcc。
b 代码使用c语言,编译时可以使用gcc ,也可以使用g++。

以.c为后缀的文件,为c代码,代码最好使用c语言。
a 代码使用c语言,编译时可以使用g++,也可以使用gcc.
b 代码使用c++语言,编译时,不能使用gcc,也不能使用g++.
既:cpp文件可以使用c语言,c++语言编写。c文件,只能使用c语言编写。

2、 两个源文件,以.cpp文件为例
在这里插入图片描述

// testadd.cpp
#include "add.hpp"
int main() {int sum = add(5,8);std::cout <<"c ++ sum = " << sum<<std::endl;return 0;
}// add.cpp
#include "add.hpp"
int add(int a, int b) {std::cout<<"a = "<<a<<std::endl;std::cout<<"b = "<<b<<std::endl;return a + b;
}// add.hpp
#include <iostream>
int add(int a, int b);// Makefile
GXX = g++
CC = gcc
TARGET = testadd
TARGET_SOURCE = testadd.cpp \add.cpp${TARGET}:${TARGET_SOURCE}${GXX} -o ${TARGET} ${TARGET_SOURCE}
clean:rm -r *.o ${TARGET}

编译指令:make。生成testadd

3、编译成动态库
源代码与实例2相同,Makefile文档如下:

GXX = g++
CC = gcc
TARGET = libadd.so
TARGET_SOURCE = add.cpp ${TARGET}:${TARGET_SOURCE}${GXX} -shared -fPIC ${TARGET_SOURCE} -o ${TARGET} 
clean:rm -r *.o ${TARGET}

编译指令:make。生成add.so

4、使用动态库
源码与上述源码相同。Makefile文件。

// Makefile
GXX = g++
CC = gcc
TARGET = testadd
TARGET_SOURCE = testadd.cpp
LIBS = /home/lily/cproject/testMakeFile/libs   # so库所在路径
${TARGET}:${TARGET_SOURCE}${GXX} -o ${TARGET} ${TARGET_SOURCE} -L${LIBS} -ladd
clean:rm -r *.o ${TARGET}

编译指令:make 。生成testadd.
注意:在./testadd 之前,需要添加
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/lily/cproject/testMakeFile/libs,否则报错找到库文件。
在这里插入图片描述
5、头文件放到include文件夹下,其他不动。Makefile

在这里插入图片描述

# Makefile
# Compile as C++11
#add_compile_options(-std=c++11)# 指定编译器
CXX = g++
CC = gcc#指定编译选项
CFLAGS = -Wall -g
TARGET = testadd
Src:=$(wildcard *.cpp)
Objs:=$(patsubst %.cpp,%.o, $(Src))
#指定头文件位置
INCLUDES = -I ./include
#指定库文件
LIBS=-L ./libs -ladd$(TARGET):$(Objs)echo $(Objs)@mkdir -p output$(CXX) $(Objs) $(LIBS) -o output/$(TARGET)%.o:%.cpp$(CXX) $(INCLUDES) $(CFLAGS) -c $< -o $@clean:rm $(Objs)
http://www.lryc.cn/news/137635.html

相关文章:

  • 深入浅出Pytorch函数——torch.nn.init.calculate_gain
  • 【PHP】PHP入门指南:从基础到进阶
  • 【100天精通python】Day45:python网络爬虫开发_ Scrapy 爬虫框架
  • 怎么写出更好的高质量内容输出
  • HJ31 单词倒排 题解
  • LeetCode42.接雨水
  • 优化时间流:区间调度问题的探索与解决
  • 【Python】强化学习:原理与Python实战
  • 设计模式——合成复用原则
  • 基于OpenCV实战(基础知识一)
  • 如何高效的接入第三方接口
  • docker pip下载依赖超时或失败问题解决
  • python并发编程
  • 【面试题】:前端怎么实现权限设计及遇到的bug
  • Vue 2 插槽
  • Spring 容器启动耗时统计
  • 1. 优化算法学习
  • 再获荣誉丨通付盾WAAP解决方案获“金鼎奖”优秀金融科技解决方案
  • 【腾讯云 TDSQL-C Serverless 产品测评】“橡皮筋“一样的数据库『MySQL高压篇』
  • python http文件上传
  • Android学习之路(9) Intent
  • vue项目配置git提交规范
  • 影响交叉导轨运行速度的因素有哪些?
  • List转Map
  • ES:一次分片设计问题导致的故障
  • vue 简单实验 自定义组件 综合应用 传参数 循环
  • 【OpenCV实战】2.OpenCV基本数据类型实战
  • MyBatis进阶:告别SQL注入!MyBatis分页与特殊字符的正确使用方式
  • 安装Node(脚手架)
  • R语言10-R语言中的循环结构