makefile与configure的LDFLAG、CFLAG、LIBS用法

在使用Makefile进行编译或者使用configure文件生成makefile的过程中,经过会涉及LDFLAGS、CFLAGS、prefix等等参数。其实这些参数最终都是传递给gcc,来对编译产生影响。

作个整理介绍:
–prefix 指定安装目录。(gcc一定对应安装?)

在LINUX中的源代码编译程序都遵守一个规则,就是以指定的目录为相对目录,安装程序,例如,安装前./configure –prefix=/ABC
那么,安装后,在/ABC下就有对于这个程序的/ABC/include该程序的头文件目录 /ABC/etc该程序的配置目录,/ABC/bin该程序应用目录等,这时,我们直接打应用程序名就不可能运行得起来,因为PATH变量里没有指向/ABC/bin应用目录,所以运行要用绝对路径/ABC/bin/application_name。
所以通常我们./configure的时候,默认是–prefix=/usr,这样的话,本程序的配置文件就会装到/usr/etc,应用文件就会安装到/usr/bin,本程序的私有库也会安装到/usr/lib等等,,我们也不用设置PATH就可以直接用了
用法示例:
./configure –prefix=”/opt/aaa/”

CFLAGS

指定头文件(.h文件)的路径,如:CFLAGS=-I/usr/include -I/path/include。如果你的头文件不处于gcc默认的路径之中,就需要使用此参数指定。那么gcc默认的搜索头文件的路径是什么呢?
使用 gcc -v -x c -E /dev/null 查看

copbint@debian2:~/workspace/test1$ gcc -v -x c -E /dev/null
......

#include "..." search starts here:


#include <...> search starts here:

/usr/lib/gcc/i686-linux-gnu/6/include
/usr/local/include
/usr/lib/gcc/i686-linux-gnu/6/include-fixed
/usr/include/i386-linux-gnu
/usr/include
.......

LDFLAGS

gcc 等编译器会用到的一些优化参数,也可以在里面指定非默认路径的库文件的位置。用法:LDFLAGS=”-L/usr/lib -L/path/to/your/lib”。
使用如下命令查看默认库文件的搜索位置:

copbint@debian2:~/workspace/test1$ gcc -print-search-dirs
install
/usr/lib/gcc/i686-linux-gnu/6/
programs
=/usr/lib/gcc/i686-linux-gnu/6/
/usr/lib/gcc/i686-linux-gnu/6/
/usr/lib/gcc/i686-linux-gnu/
/usr/lib/gcc/i686-linux-gnu/6/
/usr/lib/gcc/i686-linux-gnu/
/usr/lib/gcc/i686-linux-gnu/6/../../../../i686-linux-gnu/bin/i686-linux-gnu/6/
/usr/lib/gcc/i686-linux-gnu/6/../../../../i686-linux-gnu/bin/i386-linux-gnu/
/usr/lib/gcc/i686-linux-gnu/6/../../../../i686-linux-gnu/bin/
libraries
=/usr/lib/gcc/i686-linux-gnu/6/
/usr/lib/gcc/i686-linux-gnu/6/../../../../i686-linux-gnu/lib/i686-linux-gnu/6/
/usr/lib/gcc/i686-linux-gnu/6/../../../../i686-linux-gnu/lib/i386-linux-gnu/
/usr/lib/gcc/i686-linux-gnu/6/../../../../i686-linux-gnu/lib/../lib/
/usr/lib/gcc/i686-linux-gnu/6/../../../i686-linux-gnu/6/
/usr/lib/gcc/i686-linux-gnu/6/../../../i386-linux-gnu/
/usr/lib/gcc/i686-linux-gnu/6/../../../../lib/
/lib/i686-linux-gnu/6/
/lib/i386-linux-gnu/
/lib/../lib/
/usr/lib/i686-linux-gnu/6/
/usr/lib/i386-linux-gnu/
/usr/lib/../lib/
/usr/lib/gcc/i686-linux-gnu/6/../../../../i686-linux-gnu/lib/
/usr/lib/gcc/i686-linux-gnu/6/../../../
/lib/
/usr/lib/

LIBS

告诉链接器要链接哪些库文件,如要引入pthread和iconv,则写LIBS =” -lpthread -liconv”

PKG_CONFIG_PATH


其他:
参考:
3.3 Linux头文件和库的搜索路径

编译时,头文件的搜寻路径的配置有以下方法:
1. 编译时使用“gcc –I incpath”指定头文件搜寻路径。
2. 编译时使用环境变量 “C_INCLUDE_PATH”指定头文件搜寻路径。
3. 编译时使用gcc的默认头文件搜寻路径

链接时,库的搜寻路径的配置有以下方法:
1. 使用 “gcc –Llibpath –llibname”指定链接库搜寻路径。
2. 使用环境变量“LIBRARY_PATH” 指定链接库搜寻路径。
3. 使用ld连接脚本中的 “SEARCH_DIR” 指定链接库搜寻路径

运行时,库的搜寻路径的配置有以下方法:
1. 编译时使用 “gcc –Wl,-rpath”指定运行时动态链接库的搜寻路径,硬编码进ELF文件 “RPATH”选项。
2. 编译时使用环境变量 “LD_RUN_PATH”指定运行时动态链接库的搜寻路径,硬编码进ELF文件 “RPATH”选项。
3. 使用环境变量 “LD_LIBRARY_PATH”指定运行时动态链接库的搜寻路径。
4. 使用配置文件“/etc/ld.so.conf”指定运行时动态链接库的搜寻路径。
5. 使用运行时动态链接库的默认搜寻路径“/lib、/usr/lib”。

猜你喜欢

转载自blog.csdn.net/qq_31567335/article/details/82470477
今日推荐