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

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

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

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

  1. //div.h  静态库所用头文件
  2. #ifndef __DIV_H__
  3. #define __DIV_H__
  4. #ifdef __cplusplus
  5. extern "C" {
  6. #endif
  7. double div(double x, double y);
  8. #ifdef __cplusplus
  9. }
  10. #endif
  11. #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. CROSS =
  3. CC = $(CROSS)gcc
  4. CXX = $(CROSS)g++
  5. DEBUG = -g -O2
  6. CFLAGS = $(DEBUG) -Wall -c
  7. RM = rm -rf
  8. SRCS = $(wildcard ./*.cpp)
  9. OBJS = $(patsubst %.cpp, %.o, $(SRCS))
  10. HEADER_PATH = -I./include/
  11. LIB_PATH = -L./lib/
  12. LIBS = -ldiv
  13. # LIBS = libdiv.a
  14. VERSION = 1.0.0.1
  15. TARGET = test.$(VERSION)
  16. $(TARGET) : $(OBJS)
  17. $(CXX) $^ -o $@ $(LIB_PATH) $(LIBS)
  18. $(OBJS):%.o : %.cpp
  19. $(CXX) $(CFLAGS) $< -o $@ $(HEADER_PATH)
  20. clean:
  21. $(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. #include "add.h"
  3. #include "mul.h"
  4. #include "sub.h"
  5. #include <div.h>
  6. #include <iostream>
  7. using namespace  std;
  8. int main()
  9. {
  10. cout << "add(1, 2) = " << add(1, 2) << endl;
  11. cout << "sub(1, 2) = " << sub(1, 2) << endl;
  12. cout << "mul(1, 2) = " << mul(1, 2) << endl;
  13. cout << "div(1, 2) = " << div(1, 3) << endl;
  14. return 0;
  15. }

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

一点一点学写Makefile(3)-增加第三方库和头文件的更多相关文章

  1. import第三方库的头文件找不到的错误

    问题描述:使用cocoapods导入了第三方库,import该第三方库的某个头文件,然后编译报错找不到这个头文件内所import的头文件. 产生原因:我们需要配置头文件的搜索路径,告诉系统头文件的路径 ...

  2. Makefile目标,伪目标,头文件自动依赖

    目标 即我们最终要生成的文件,make默认生成第一个目标,注意 makefile中tab和空格不是一回事,规则使用tab缩进,编辑器不要设置诸如"将tab替换为空格之类的选项",目 ...

  3. 使用java以及jdbc不使用第三方库执行sql文件脚本

    使用java以及jdbc不使用第三方库执行sql文件脚本 2017年02月15日 15:51:45 阅读数:660 使用java执行sql脚本的方法 解析sql脚本,删除不必要的注释和空行 将语句按分 ...

  4. 一点一点学写Makefile(2)-自动搜所当前目录下的所有源文件

    上个博客我们使用的是笨方法添加源文件,本次我要实现的是遍历文件夹来获得所有的cpp文件 //makefile CROSS = CC = $(CROSS)gcc CXX = $(CROSS)g++ DE ...

  5. UE4使用第三方库读写xml文件

    原文链接:http://gad.qq.com/article/detail/7181031 本文首发腾讯GAD开发者平台,未经允许,不得转载 在游戏开发过程中,读写xml几乎已经成为不可或缺的功能,但 ...

  6. 一点一点学写Makefile(4) - 编译时指定宏参数

    我们在项目中有时为了方便会自定义一些与项目无关的功能,例如打印输出一些提示信息.将关键协议生成文件等,但是如果每次都通过修改代码的方法来实现,测试部门就会认为你改的这些代码可能会带来其他问题.对于这种 ...

  7. 一点一点学写Makefile(6)-遍历当前目录源文件及其子目录下源文件

    时候,我们在开发的时候需要将本次工程的代码分成多个子目录来编写,但是在Makefile的编写上却是个问题,下面我就教大家怎么构建带有子文件夹的源代码目录的自动扫描编译 下面这张图是我的文件树 这里面s ...

  8. 一点一点学写Makefile(5)-获取文件所在路径

    我们在开发一套代码时,应该保证工程放到任何一个目录中均可以编译成功,但是有时候链接库的时候会造成编译错误,本次就会告诉大家如何动态的获得工程所在的绝对路径 代码下载目录 选择Makefile-5 // ...

  9. java调用含第三方库的py文件

    这是一个心酸的历程. py文件如下: 这里调用出现的问题主要是第三方包的问题,因为你的py文件里可能含有很多三方库文件,jython的jar包里可能不含有这个,所以这时需要你找到你已有三方库文件的ex ...

随机推荐

  1. 《UML和模式应用(原书第3版)》目录

    学习 <UML和模式应用(原书第3版)>目标: 理解OOA/D思想 如何使用UML建模 如何使用设计模式 如何设计分层架构 目录: 第1部分 绪论 第1章 面向对象分析和设计 第2章 迭代 ...

  2. 利用Flume将本地文件数据中收集到HDFS

    1. 创建文件 放入一个txt文件 然后查看hdfs上的文件夹 不知道为什么并没有出现本地的文件 也不报错 后来发现,没有在logs文件夹下面,在newlogs文件夹下面

  3. linux 登陆失败处理

    1.备份要操作的两个配置文件 cp /etc/pam.d/sshd /etc/pam.d/sshd.bak cp /etc/pam.d/login /etc/pam.d/login.bak 2.检查是 ...

  4. 设计模式学习总结(六)原型模式(Prototype)

    原型模式即通过对象拷贝的方式来实现对同类对象的生成的一种设计模式! 浅复制:对于值类型,则直接复制该值,对于引用类型的字段则是对其引用的复制,如果原引用与现引用只要有一个的值发生变化,则都会造成两者值 ...

  5. curl -w函数

    url_effective 最终获取的url地址,尤其是当你指定给curl的地址存在301跳转,且通过-L继续追踪的情形. http_code http状态码,如200成功,301转向,404未找到, ...

  6. (转)shell实现多级菜单脚本编写

    shell实现多级菜单脚本编写 原文:https://www.yuanmas.com/info/2gOwBPvqyb.html 这篇文章主要介绍了Shell实现多级菜单系统安装脚本实例分享,本文脚本用 ...

  7. 牛客网Java刷题知识点之TCP、UDP、TCP和UDP的区别、socket、TCP编程的客户端一般步骤、TCP编程的服务器端一般步骤、UDP编程的客户端一般步骤、UDP编程的服务器端一般步骤

    福利 => 每天都推送 欢迎大家,关注微信扫码并加入我的4个微信公众号:   大数据躺过的坑      Java从入门到架构师      人工智能躺过的坑         Java全栈大联盟   ...

  8. Mixamo Fuse10分钟创建角色

    http://edu.manew.com/course/132 太6了

  9. Bootstrap组件介绍

    一.下拉菜单 用于显示链接列表的可切换.有上下文的菜单.下拉菜单的 JavaScript 插件让它具有了交互性. 1.实例 将下拉菜单触发器和下拉菜单都包裹在 .dropdown 里,或者另一个声明了 ...

  10. javascript统计一个字符在一段字符串出现次数

      <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8" ...