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)
相关推荐
Madison-No723 分钟前
搭建项目测试环境
linux·运维·服务器·python
吴声子夜歌1 小时前
Shell编程实例——编写安全的shell脚本(二)
linux·运维·shell
悠悠121382 小时前
微服务通信别只看性能:REST 与 gRPC 的 6 个选型判断和一次 502 故障复盘
运维·服务器
xiaoye-duck3 小时前
《Linux 网络编程》深入理解 IP 协议(二):网段划分、私有 IP 与 NAT 地址转换
linux·网络·ip
云老大-阿里云国际站代理商3 小时前
华为云国际站服务代理商:NAT网关怎么配?多台ECS共用公网IP要注意什么
服务器·华为云·云计算
zx_741484814 小时前
【Linux入门】Shell 函数、正则表达式与文本处理:cut 与 awk
linux·运维·正则表达式
Zenova EdgeOS4 小时前
Linux dmesg 工业边缘实战:内核日志过滤、持久化与故障定位
linux·运维·边缘计算·工业边缘·dmesg·内核日志
金士顿4 小时前
System.Text.Json Source Generator 深度解析:为什么 Native AOT 不喜欢反射
linux·asp.net core·arm64·net·native aot
wdfk_prog5 小时前
ROS教程08:从 TransportTCP::connect() 追到 TCPROS Connection Header、序列化与 Socket 数据传输
运维·缓存·docker·容器·ros
做运维的阿瑞5 小时前
Python 标准库汇总:分类速览与常用模块清单
linux·运维·python