Makefile的简单编写

简单的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)
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值