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)
相关推荐
时间之里1 分钟前
【linux】:目录解析
linux·运维·服务器
2501_945837435 分钟前
云服务器运维实战:从环境搭建到安全加固全流程
服务器
qq_3176203124 分钟前
001:Linux 命令速查手册
linux·运维·服务器
Element_南笙27 分钟前
BUG:ModuleNotFoundError: No module named ‘milvus_lite‘
java·服务器·数据库
落笔映浮华丶28 分钟前
linux中vim常用命令
linux
Coder_Boy_34 分钟前
分布式系统设计经验总结:金融vs电商的核心差异与决策思路
java·运维·微服务·金融·电商
彷徨而立36 分钟前
【SDL】多线程中,SDL_Init() 接口被两个线程同时调用了,会有啥问题?
linux·sdl
铅笔侠_小龙虾37 分钟前
Ubuntu 搭建前端环境&Vue实战
linux·前端·ubuntu·vue
世转神风-38 分钟前
linux-嵌入式开发基础-网线直连-局域网传输文件-快速完成文件替换
linux·嵌入式
biubiubiu070639 分钟前
Ansible自动化
运维·自动化·ansible