Linux:编写编译脚本Makefile文件

一、生成可执行文件

1、一个源文件编译

本例子主要区别.c及.cpp文件及编译该文件时使用的编译链。

1).c文件

bash 复制代码
// 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文件

bash 复制代码
// 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文件为例

bash 复制代码
// 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文档如下:

bash 复制代码
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文件。

bash 复制代码
// 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

bash 复制代码
# 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)
相关推荐
风曦Kisaki2 分钟前
# Kubernetes(K8s)笔记Day13 :工作负载资源概述与 Job (CronJob)控制器
linux·笔记·云原生·容器·kubernetes
vortex55 分钟前
ss 命令指南:网络排查神器
linux·运维·网络·终端
智塑未来8 分钟前
鸿蒙系统小红书隐私保护——应用锁开启指南
服务器·前端·harmonyos
Shadow(⊙o⊙)16 分钟前
Linux网络部分——基于UDP的四大接口,实例应用,常考汇总,完整服务端、客户端设计流程+代码
linux·网络·udp
深念Y23 分钟前
老Flyme 官方 root 开启 ADB TCP 方案
linux·数据库·网络协议·tcp/ip·adb·智能手机·emmc
小此方1 小时前
Re:Linux系统篇(五十二)线程篇 · 五:直击 Linux 内核底层:TCB 与 LWP 一体两面全解析(附自定义线程封装)
linux·运维·驱动开发
ltl9 小时前
校验和与数据完整性:CRC32C、xxHash 与端到端校验
linux
我是小灰灰吖10 小时前
Ubuntu 22.04 设置 CPU 性能模式:提升系统响应速度
linux·ubuntu
ltl10 小时前
持续性能分析:Parca、Pyroscope、Grafana Beyla
linux
ltl10 小时前
Direct I/O 与 O_DIRECT:绕过缓存的得与失
linux