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.o

testadd:${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.o

testadd:${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)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/87880.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计算机竞赛 基于YOLO实现的口罩佩戴检测 - python opemcv 深度学习

文章目录 0 前言1 课题介绍2 算法原理2.1 算法简介2.2 网络架构 3 关键代码4 数据集4.1 安装4.2 打开4.3 选择yolo标注格式4.4 打标签4.5 保存 5 训练6 实现效果6.1 pyqt实现简单GUI6.3 视频识别效果6.4 摄像头实时识别 7 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xf…

13.4 目标检测锚框标注 非极大值抑制

锚框的形状计算公式 假设原图的高为H,宽为W 锚框形状详细公式推导 以每个像素为中心生成不同形状的锚框 # s是缩放比&#xff0c;ratio是宽高比 def multibox_prior(data, sizes, ratios):"""生成以每个像素为中心具有不同形状的锚框"""in_he…

windows安装新openssl后依然显示旧版本

1、Windows环境下升级openssl后&#xff0c;通过指令openssl version -a查看版本号&#xff1a; 这个版本号是以前的老版本&#xff0c;不知道在哪里 2、网上找了老半天也没找到答案&#xff0c;最后通过指令 where openssl 才找到原来的openssl在哪里&#xff0c;把老的卸载掉…

ASEMI快恢复二极管APT80DQ20BG封装尺寸

编辑-Z APT80DQ20BG参数描述&#xff1a; 型号&#xff1a;APT80DQ20BG 最大峰值反向电压(VRRM)&#xff1a;200V 最大直流阻断电压VR(DC)&#xff1a;200V 平均整流正向电流(IF)&#xff1a;80A 非重复峰值浪涌电流(IFSM)&#xff1a;600A 工作接点温度和储存温度(TJ, …

使用VisualStudio制作上位机(二)

文章目录 使用VisualStudio制作上位机(二)第三部分:GUI内部函数设计使用VisualStudio制作上位机(二) Author:YAL 第三部分:GUI内部函数设计 事件添加 给窗体或窗体按钮相关的操作添加事件有两种方式,事件的名字直白的表面了这是什么事件。 直接双击界面,自动生成窗…

SocketTools.NET 11.0.2148.1554 Crack

添加新功能以简化使用 URL 建立 TCP 连接的过程。 2023 年 8 月 23 日 - 12:35新版本 特征 添加了“HttpGetTextEx”函数&#xff0c;该函数在返回字符串缓冲区中的文本内容时提供附加选项。添加了对“FileTransfer”.NET 类和 ActiveX 控件中的“GetText”和“PutText”方法的…

python模拟登入某平台+破解验证码

概述 python模拟登录平台&#xff0c;遇见验证码识别&#xff01;用最简单的方法seleniumda破解验证码&#xff0c;来自动登录平台 详细 python用seleniumxpath模拟登录破解验证码 先随便找个小说平台用户登陆 - 书海小说网用户登陆 - 书海小说网用户登陆 - 书海小说网 准…

2023年8月22日OpenAI推出了革命性更新:ChatGPT-3.5 Turbo微调和API更新,为您的业务量身打造AI模型

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

【Spring Boot】详解条件注解以及条件拓展注解@Conditional与@ConditionalOnXxx

Spring Conditional Spring 4.0提供的注解。作用是给需要装载的Bean增加一个条件判断。只有满足条件才会装在到IoC容器中。而这个条件可以由自己去完成的&#xff0c;可以通过重写Condition接口重写matches()方法去实现自定义的逻辑。所以说这个注解增加了对Bean装载的灵活性。…

【肌电图信号分析】通道肌电图并查找收缩周期的数量、振幅、最大值和持续时间(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

在本地搭建Jellyfin影音服务器,支持公网远程访问影音库的方法分享

文章目录 1. 前言2. Jellyfin服务网站搭建2.1. Jellyfin下载和安装2.2. Jellyfin网页测试 3.本地网页发布3.1 cpolar的安装和注册3.2 Cpolar云端设置3.3 Cpolar本地设置 4.公网访问测试5. 结语 1. 前言 随着移动智能设备的普及&#xff0c;各种各样的使用需求也被开发出来&…

threejs贴图系列(一)canvas贴图

threejs不仅支持各种texture的导入生成贴图&#xff0c;还可以利用canvas绘制图片作为贴图。这就用到了CanvasTexture&#xff0c;它接受一个canas对象。只要我们绘制好canvas&#xff0c;就可以作为贴图了。这里我们利用一张图片来实现这个效果。 基础代码&#xff1a; impo…

sizeof和strlen的对比

文章目录 &#x1f6a9;前言&#x1f6a9;sizeof&#x1f6a9;strlen&#x1f6a9;sizeof和strlen对比 &#x1f6a9;前言 很多小白在学习中&#xff0c;经常将sizeof和strlen弄混了。本篇文章&#xff0c;小编讲解一下sizeof和strlen的区别。&#x1f937;‍♂️ &#x1f6a9…

分享好用的翻译软件

网易有道翻译→网易有道翻译

npm install 安装依赖,报错 Host key verification failed

设置 git 的身份和邮箱 git config --global user.name "你的名字" > 用户名 git config --global user.email “你的邮箱" > 邮箱进入 > 用户 > [你的用户名] > .ssh文件夹下,删除 known_hosts 文件即可 进入之后有可能会看到 known_hosts…

css实现文字的渐变,适合大屏

1 在全局写一个全局样式&#xff0c;文字渐变 2 在组件中使用 CSS3利用-webkit-background-clip: text;实现文字渐变效果_css如何把盒子底部的文字变成透明渐变_I俩月亮的博客-CSDN博客 CSS 如何实现文字渐变色 &#xff1f;_css字体颜色渐变_一个水瓶座程序猿.的博客-CSDN博客…

docker 安装 redis

目录 1、下载镜像文件 2、创建实例并启动 3、使用 redis 镜像执行 redis-cli 命令连接 4、redis持久化操作 5、然后按照第3点&#xff0c;再试一试&#xff0c;看看redis持久化是否配置成功。 6、最后与redis可视化工具测试连接 大家先 su root&#xff0c;这让输入命令就…

goland 中的调试器 -- Evaluate

今天一个好朋友 找到我&#xff0c;问我关于goland中Evaluate 小计算器的使用方式&#xff0c;说实话&#xff0c;我在此之前也没用过这个东西&#xff0c;然后我就找一些相关文档&#xff0c;但是这类文档少的可怜&#xff0c;所以我就稍微研究一下&#xff0c;找找材料&#…

【QT5-自我学习-线程qThread移植与使用-通过代码完成自己需要功能-移植小记3】

【QT5-自我学习-线程qThread移植与使用-通过代码完成自己需要功能-移植小记3】 1、前言2、实验环境3、自我总结&#xff08;1&#xff09;文件的编写&#xff08;2&#xff09;信号与槽的新理解&#xff08;3&#xff09;线程数据的传递 4、移植步骤第一步&#xff1a;添加新文…

华为云Stack的学习(一)

一、华为云Stack架构 1.HCS 物理分散、逻辑统一、业务驱动、运管协同、业务感知 2.华为云Stack的特点 可靠性 包括整体可靠性、数据可靠性和单一设备可靠性。通过云平台的分布式架构&#xff0c;从整体系统上提高可靠性&#xff0c;降低系统对单设备可靠性的要求。 可用性…