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

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

如上图,我们会将第三方库的头文件放到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. Java 不可变对象

    不可变对象(immutable objects):一旦对象被创建,它们的状态就不能被改变(包括基本数据类型的值不能改变,引用类型的变量不能指向其他的对象,引用类型指向的对象的状态也不能改变),每次对他 ...

  2. ngin日志格式

    日志格式 为了更好满足分析场景,推荐采用如下log_format配置.   log_format main '$remote_addr - $remote_user [$time_local] &qu ...

  3. jquery双日历日期选择器bootstrap-daterangepicker日历插件

    这个插件既可以作为双日历也可以作为单日历插件(jquery的插件在jquery插件库中http://www.jq22.com/下载很方便,在CSDN下载真麻烦) 引用 <meta http-eq ...

  4. Bloom filter和Counting bloom filter

    Bloom filter原理: https://en.wikipedia.org/wiki/Bloom_filter 推导过程结合博客: https://blog.csdn.net/jiaomeng/ ...

  5. linux命令之find

    find find命令的格式:find [-path……] -options [-print -exec -ok] path:要查找的目录路径.       ~ 表示$HOME目录       . 表 ...

  6. Angular4+NodeJs+MySQL 入门-06 接口配置

    在上篇中说了怎么调用接口,这篇就来说说,接口配置吧. 后端是用NodeJS来写的,由于写后台(以前用的是C#语言)的时候,大部操作都在是对数据库表的增.删.改.查操作, 比如:根据查询出来的数据,然后 ...

  7. bootstrap框架的使用

    1.默认修改input输入框激活的颜色(充电桩) .form-control:focus, .ms-choice:focus, input[type=text]:focus, input[type=p ...

  8. PHP Mongodb API参考

    <?php /*** Mongodb类** examples: * $mongo = new HMongodb("127.0.0.1:11223"); * $mongo-&g ...

  9. document.write与document.getElementById.innterHTML的区别

    <html> <head> <meta charset="utf-8"> <script> var tmp = "< ...

  10. Bootstrap table使用知识-转

    http://www.cnblogs.com/landeanfen/p/5005367.html 官方文档:http://bootstrap-table.wenzhixin.net.cn/zh-cn/ ...