简单的Makefile文件的编写
- 以下是我当前编写的程序的目录(无动态库)
├── gg //gg文件夹是其中的一个源文件文件夹
│ └── hh.cpp
├── hello //hello文件夹是另外一个源文件的文件夹
│ ├── hello.cpp
│ ├── main.cpp
│ └── test.cpp
├── include //include 文件夹统一存放的是全部源文件或者后面还要接着写的动态库或者静态库的头文件
│ ├── hello.h
│ ├── hh.h
│ └── test.h
├── makefile //makefile文件放在这个文件夹的根目录下
└── output //output文件夹主要用来存放编译的中间文件,大多数都是.o文件,还要生成的目标target
- 废话不多说,直接上makefile的编写。
#Makefile的编写主要是要注意3个点:1.目标 2.依赖 3.规则
#CROSS_COMPILE = aarch64-imx8mm-linux-gnu-
CXX = $(CROSS_COMPILE)g++#编译器
TARGET = app#目标文件
SRC_DIR = ./hello ./gg#源文件的路径
OUTPUT = ./output#将目标文件和.o文件输出到对应的目录下
INC = -I ../include#头文件目录
FILES = $(foreach dir,$(SRC_DIR),$(wildcard $(dir)/*.cpp))#将DIR目录下的所有的.cpp文件都加到FILES这个变量中
OBJS = $(patsubst %.cpp,%.o,$(FILES))#将FILES文件中的.cpp文件全部替换成.o文件 这个时候OBJS这个变量中就全部都是.o文件了
all:$(TARGET)
$(TARGET):$(OBJS)
$(CXX) -o $(OUTPUT)/$@ $(INC) $(FILES)
%.o:%.cpp
$(CXX) -c $(INC) $< -o $(OUTPUT)/$(notdir $@)
clean:
rm -f ./output/*.o
rm -f ./output/$(TARGET)
注意点:1.对变量的使用,一定一定要注意加括号
2.g++或gcc前面一定要加tab键
3.如果要给对应行的代码做注释的时候,一定要注意空格,要贴着代码的最后一个空格做注释
-
添加了动态库的编译(最大的区别就是在于,需要链接库,同时要注意库文件的头文件)
以下是我新的文件目录数
├── depts //用来存放相关的库和头文件
│ ├── include
│ │ └── mylib.h //与库相关的头文件
│ └── lib
│ └── libmylib.so //动态库文件
├── gg //gg文件夹是其中的一个源文件文件夹
│ └── hh.cpp
├── hello //hello文件夹是另外一个源文件的文件夹
│ ├── hello.cpp
│ ├── main.cpp
│ └── test.cpp
├── include //include 文件统一存放的是全部源文件或者后面还要接着写的动态库或者静态库的头文件
│ ├── hello.h
│ ├── hh.h
│ └── test.h
├── makefile //makefile文件放在这个文件夹的根目录下
└── output //output文件夹主要用来存放编译的中间文件,大多数都是.o文件,还要生成的目标target -
废话不多说,直接上写好的makefile文件
#Makefile的编写主要是要注意3个点:1.目标 2.依赖 3.规则 #CROSS_COMPILE = aarch64-imx8mm-linux-gnu- CXX = $(CROSS_COMPILE)g++#编译器 TARGET = app#目标文件 SRC_DIR = ./hello ./gg#源文件的路径 OUTPUT = ./output#将目标文件和.o文件输出到对应的目录下 INC = -I ../include #头文件目录 MY_LIB = -lmylib -L./depts/lib#相比上面,就是这里添加了链接的选项 FILES = $(foreach dir,$(SRC_DIR),$(wildcard $(dir)/*.cpp))#将DIR目录下的所有的.cpp文件都加到FILES这个变量中 OBJS = $(patsubst %.cpp,%.o,$(FILES))#将FILES文件中的.cpp文件全部替换成.o文件 这个时候OBJS这个变量中就全部都是.o文件了 all:$(TARGET) $(TARGET):$(OBJS) $(CXX) -o $(OUTPUT)/$@ $(INC) $(FILES) $(MY_LIB)#这里添加链接选项 %.o:%.cpp $(CXX) -c $(INC) $< -o $(OUTPUT)/$(notdir $@) clean: rm -f ./output/*.o rm -f ./output/$(TARGET)
注意:动态库一般是在可执行文件运行的时候才去链接动态库,所以需要设置好动态库加载路径的环境变量
使用的时候 export LD_LIBRARY_PATH=./depts/lib (按自己的文件夹的实际路径来设置)
可使用ldd命令来查看可执行文件依赖的是那些动态库
如:
root@root-linux:~/rubbish/makefile2$ ldd ./output/app linux-vdso.so.1 (0x00007ffc5b590000) libmylib.so => ./depts/lib/libmylib.so (0x00007f87f439c000) //这里就可以看到我们依赖的库了 libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f87f4013000) libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f87f3dfb000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f87f3a0a000) libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f87f366c000) /lib64/ld-linux-x86-64.so.2 (0x00007f87f47a1000)