zoukankan      html  css  js  c++  java
  • 一点一点学写Makefile(3)-增加第三方库和头文件

    我们在写代码的时候不一定都是有自己来完成,一个工程中会大量使用一些比较优秀的动态库、静态库等,我们在使用这些库完成所有的代码后,需要在编译的时候将这些库使用的头文件添加到我们的工程上,将他的库文件也添加到我们的工程中,接下来我们就来看一下怎么来添加。

    我们在项目中很少将第三方库与我们自己的代码放到同一个目录中,而是有一些约定俗成的存放方法:


    如上图,我们会将第三方库的头文件放到include文件夹,将第三方的静态库放到lib文件夹,将动态库放到bin文件夹,(注:如果是使用开源库尽可能使用静态库,因为这样会给部署带来极大的方便,我没在工程中使用动态库,因此没有bin文件夹,在这里需要提一下的就是,因为动态库so文件是在程序运行时加载的,因此需要联通程序一同发布)

    废话不多说上代码(代码下载地址  选择makefile-3)

    1. //div.h  静态库所用头文件  
    2.   
    3. #ifndef __DIV_H__  
    4. #define __DIV_H__  
    5.   
    6. #ifdef __cplusplus  
    7. extern "C" {  
    8. #endif  
    9.   
    10. double div(double x, double y);  
    11.   
    12. #ifdef __cplusplus  
    13. }  
    14. #endif  
    15.   
    16. #endif  //__DIV_H__  


    03lib

        |----lib

               |----libdiv.a

         |----include

               |----div.h

        |----main.cpp main.h

        |----add.cpp add.h

        |----sub.cpp sub.h

        |----mul.cpp mul.h

        |----Makefile

    上面这是我的文件结构图,其中libdiv.a是我引用的外部库,div.h是该库的头文件,这两个文件分别放在了lib和include文件夹,下面请看我的Makefile文件夹

    1. Makefile  
    2.   
    3. CROSS =   
    4. CC = $(CROSS)gcc  
    5. CXX = $(CROSS)g++  
    6. DEBUG = -g -O2  
    7. CFLAGS = $(DEBUG) -Wall -c  
    8. RM = rm -rf  
    9.   
    10. SRCS = $(wildcard ./*.cpp)  
    11. OBJS = $(patsubst %.cpp, %.o, $(SRCS))  
    12.   
    13. HEADER_PATH = -I./include/  
    14. LIB_PATH = -L./lib/  
    15.   
    16. LIBS = -ldiv      
    17. # LIBS = libdiv.a  
    18.   
    19. VERSION = 1.0.0.1  
    20. TARGET = test.$(VERSION)  
    21.   
    22. $(TARGET) : $(OBJS)  
    23.     $(CXX) $^ -o $@ $(LIB_PATH) $(LIBS)  
    24.   
    25. $(OBJS):%.o : %.cpp  
    26.     $(CXX) $(CFLAGS) $< -o $@ $(HEADER_PATH)  
    27.   
    28. clean:  
    29.     $(RM) $(TARGET) *.o   

    如上图,我添加了13、14、16、17行,其中13和14行是为了告诉源代码第三方库和头文件的路径,16行和17行意义是完全相同的,16行只是显示的表明我用静态库,但是在使用的时候需要注意,LIBS = -ldiv的方式一般用于动态库,LIBS = libdiv.a适用于静态库加载,而且只有当libdiv.a与Makefile在同一目录下才可以,一般静态库使用将目录写死的方式,但是这样的话又不方便代码的传播,在一点一点学写Makefile5我们将告诉大家如何灵活的将目录写死。

    在23行我写的是$(CXX) $^  -o $@ $(LIB_PATH) $(LIBS),这是在最后链接是需要告诉编译器我的库放在了那个目录,以及该库的名字

    在26行,我在后面添加了一个$(HEADER_PATH)即指定头文件的所在目录


    1. //main.cpp  
    2.   
    3. #include "add.h"  
    4. #include "mul.h"  
    5. #include "sub.h"  
    6.   
    7. #include <div.h>  
    8.   
    9. #include <iostream>  
    10. using namespace  std;  
    11.   
    12. int main()  
    13. {  
    14.     cout << "add(1, 2) = " << add(1, 2) << endl;  
    15.     cout << "sub(1, 2) = " << sub(1, 2) << endl;  
    16.     cout << "mul(1, 2) = " << mul(1, 2) << endl;  
    17.     cout << "div(1, 2) = " << div(1, 3) << endl;  
    18.   
    19.     return 0;  
    20. }  


    看上图,注意我在包含div.h时候选择的<>符号

  • 相关阅读:
    使用Spring的MailSender发送邮件
    使用Spring的MailSender发送邮件
    C# List源码分析(二)
    EasyUI闪屏,EasyUI页面加载提示:原理+代码+效果图
    EasyUI闪屏,EasyUI页面加载提示:原理+代码+效果图
    Android Studio快捷键指南(本文持续更新)
    EventBus3.0使用总结
    hihoCoder #1054 滑动解锁
    hihoCoder #1069 最近公共祖先·三
    hdu 4411 Arrest
  • 原文地址:https://www.cnblogs.com/catgatp/p/6527232.html
Copyright © 2011-2022 走看看