一点一点学写Makefile(3)-增加第三方库和头文件

原创 2016年06月02日 10:19:48

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

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


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

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

//div.h  静态库所用头文件

#ifndef __DIV_H__
#define __DIV_H__

#ifdef __cplusplus
extern "C" {
#endif

double div(double x, double y);

#ifdef __cplusplus
}
#endif

#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文件夹

Makefile

CROSS = 
CC = $(CROSS)gcc
CXX = $(CROSS)g++
DEBUG = -g -O2
CFLAGS = $(DEBUG) -Wall -c
RM = rm -rf

SRCS = $(wildcard ./*.cpp)
OBJS = $(patsubst %.cpp, %.o, $(SRCS))

HEADER_PATH = -I./include/
LIB_PATH = -L./lib/

LIBS = -ldiv    
# LIBS = libdiv.a

VERSION = 1.0.0.1
TARGET = test.$(VERSION)

$(TARGET) : $(OBJS)
	$(CXX) $^ -o $@ $(LIB_PATH) $(LIBS)

$(OBJS):%.o : %.cpp
	$(CXX) $(CFLAGS) $< -o $@ $(HEADER_PATH)

clean:
	$(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)即指定头文件的所在目录


//main.cpp

#include "add.h"
#include "mul.h"
#include "sub.h"

#include <div.h>

#include <iostream>
using namespace  std;

int main()
{
    cout << "add(1, 2) = " << add(1, 2) << endl;
    cout << "sub(1, 2) = " << sub(1, 2) << endl;
    cout << "mul(1, 2) = " << mul(1, 2) << endl;
    cout << "div(1, 2) = " << div(1, 3) << endl;

    return 0;
}

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



版权声明:本文为博主原创文章,自己总结难免有出错或是不周全的地方,望指出......

Linux学习笔记——例说makefile 增加自定义共享库

0.前言     从学习C语言开始就慢慢开始接触makefile,查阅了很多的makefile的资料但总感觉没有真正掌握makefile,如果自己动手写一个makefile总觉得非常吃力。所以特意借...

Qt中Makefile文件里INCPATH和LIBS参数详解

1 LIBS中的-l 和 -L参数   -l 参数是用来指定程序要连接的库, -l参数紧接着就是库名, 库名和真正的库文件名的差别, 以数学库为例, 其库名为 m , 其 库文件名为 libm.s...

makefile研究(3)

前面讲了Makefile 的简单语法和简单的应用模板,但在实际项目应用中比这个肯定复杂很多,但是我想说他的Makefile应用模式都是大同小异,只是代码量和工程复杂度大写而已。 我觉得一个完整的...

Makefile经典教程(掌握这些足够)

makefile很重要       什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professio...
  • ruglcc
  • ruglcc
  • 2012年07月31日 15:28
  • 443431

Linux学习笔记——例说makefile 头文件查找路径

0.前言     从学习C语言开始就慢慢开始接触makefile,查阅了很多的makefile的资料但总感觉没有真正掌握makefile,如果自己动手写一个makefile总觉得非常吃力。所以特意借...

多文件,多头文件时gcc与makefile的编写经验

经常在一个项目中包含多个.c源文件,而且一个.c源文件包含了一堆的头文件,这种情况下如何编写makefile,使得能成功编译整个项目?本博文对这些问题提出自己浅析的理解。涉及到对gcc命令使用与编译流...

C语言 makefile文件与头文件的写法。

makefile 文件的书写。 总结下make 执行过程       1)make 在当前目录下找 "Makefile"或"makefile"的文件     2)如果找到,则会找文件中第一个目标文件(...
  • OOC_ZC
  • OOC_ZC
  • 2015年12月13日 13:39
  • 894

Linux学习笔记——例说makefile 头文件查找路径

转自:http://blog.csdn.net/xukai871105/article/details/36476793 0.前言     从学习C语言开始就慢慢开始接触makefile,查...

makefile 中的 指定库和头文件的路径

makefile中的指定头文件,源文件 可以使用VPATH变量也可以使用vpath后者可以分类指定头文件源文件的搜索路径 记住这样指定的路径仅仅是makefile本身查找头文件源文件的路径 在执行m...

makefile指定头文件和库出错的那点破事

某模块提供了test.h头文件和libtest.a库, 供外部代码调用: 1. 如果在代码中包含了某头文件test.h, 但在makefle中没有指定头文件路径/或者头文件根本不存在, ...
  • stpeace
  • stpeace
  • 2016年03月26日 10:38
  • 1897
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一点一点学写Makefile(3)-增加第三方库和头文件
举报原因:
原因补充:

(最多只允许输入30个字)