Makefile 与 源码包安装

Makefile基础

Makefile 其实只是⼀个指示make程序(也简称 make 或 make命令)
Makefile三要素
在这里插入图片描述
工作原理
最开始执行make时
在这里插入图片描述
更新依赖后,再执行make
在这里插入图片描述

Makefile规则

目标:目标可以直接是我们要生成的文件,也可以是伪目标(执行命令但不会生成对应文件)。伪目标可以采用.PHONY 关键字来定义(注意的是其必须是大写字母)。比如:.PHONY: clean来定义clean为目标。

依赖:依赖可以是已经存在的文件,也可以是下面的子目标。如果依赖是已经存在的文件,则可以省略,而子目标不行。

命令:命令可以不生成目标,也可以不包含依赖。即命令可以与目标和依赖无关。命令前要加tab键。在命令前加上@,则在make时,此命令不会打印到终端。

变量:Makefile中的自动变量
$@用于表示⼀个规则中的目标。 当我们的⼀个规则中有多个目标时, $@所指的是其中任何造成命令被运行的目标。
$^则表示的是规则中的所有先择条件(所有依赖)。
$<表示的是规则中的第⼀个先决条件(第一个依赖)。

函数:wildcard函数
wildcard是通配符函数,通过它可以得到我们所需的文件, 这个函数如果我们在Windows 或Linux是命令行中的 " * " 。 其形式是$(wildcard pattern)。

源码包安装

三个步骤:配置(configure)、编译(make)、安装(make install)。
以libevent为例
在这里插入图片描述
注意:
1、最好在每一个命令前加上sudo
2、一般第一个配置步骤使用命令 ./configure --prefix=/usr/local/libevent
这个命令可以把所有资源文件放在/usr/local/test的路径中,不会杂乱。
以后想要卸载,只需要将安装目录 libevent 卸载就行。
而如果不配置 --prefix 选项,安装后可执行文件默认放在 /usr /local/bin,库文件默认放在 /usr/local/lib,头文件默认放在 /usr/loacl/include ,配置文件默认放在 /usr/local/etc,其它的资源文件放在 /usr/local/share,比较凌乱。
3、Linux添加环境变量与GCC编译器添加INCLUDE与LIB环境变量
参考 https://www.cnblogs.com/image-eye/archive/2011/08/20/2147133.html

对所有用户有效在/etc/profile增加以下内容。只对当前用户有效在Home目录下的
.bashrc或.bash_profile里增加下面的内容:
(注意:等号前面不要加空格,否则可能出现 command not found)

#在PATH中找到可执行文件程序的路径。
export PATH=$PATH:/MYPATH

#gcc找到头文件的路径
C_INCLUDE_PATH=$C_INCLUDE_PATH:/MyInclude
export C_INCLUDE_PATH

#g++找到头文件的路径
CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/usr/include/libxml2:/MyLib
export CPLUS_INCLUDE_PATH

#找到动态链接库的路径
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/MyLib
export LD_LIBRARY_PATH

#找到静态库的路径
LIBRARY_PATH=$LIBRARY_PATH:/MyLib
export LIBRARY_PATH

动态库调用问题

如果 configure 步骤没有使用–prefix , 直接在gcc命令后加 -levent
如:gcc hello-world.c -o hello -levent。此 -levent 对应 libevent.so 动态库。
如果使用了–prefix
方法一:直接指定要调用的动态库 libevent.so 文件路径以及include路径, 使用命令(以上述libevent为例) gcc hello-world.c -o hello -I /usr/local/libevent/include -L /usr/local/libevent/lib -levent

方法二:设置环境变量 (强烈推荐)
临时设置:
export LD_LIBRARY_PATH=动态库的绝对路径:$LD_LIBRARY_PATH(只添加新值,等号两边不能空格,路径也不需要双引号)
永久设置:
「用户级别」将export LD_LIBRARY_PATH=动态库的加载路径添加到~/.bashrc文件;然后重新加载,方法为重启终端或者运行 source ./bashrc; 即可生效。
「系统级别」将绝对路径加入到/etc/profile文件,然后用命令source /etc/profile重新加载该文件.

方法三:修改 /etc/ls.so.conf
将 libevent.so 所在绝对路径追加入到/etc/ld.so.conf文件,使用sudo ldconfig -v 更新

可以得出动态库的搜索路径搜索的先后顺序是:
1.编译目标代码时 -L 指定的动态库搜索路径;
2.环境变量LD_LIBRARY_PATH指定的动态库搜索路径;
3.配置文件/etc/ld.so.conf中指定的动态库搜索路径;
4.默认的动态库搜索路径/lib;
5.默认的动态库搜索路径/usr/lib。

头文件搜索路径的先后顺序是
1.编译目标代码时 -I 指定的头文件目录;
2.环境变量 C_INCLUDE_PATH,CPLUS_INCLUDE_PATH,OBJC_INCLUDE_PATH;
3.系统目录 /usr/include 和 /usr/local/include;
4.gcc的一系列自带目录。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值