Linux c编译库路径,【一点一点学Linux C】交叉编译时候如何配置连接库的搜索路径...

交叉编译的时候不能使用本地(i686机器,即PC机器,研发机器)机器上的库,但是在做编译链接的时候默认的是使用本地库,即/usr/lib,/lib两个目录。因此,在交叉编译的时候,要采取一些方法使得在编译链接的时候找到需要的库。

首先,要知道:编译的时候只需要头文档,真正实际的库文档在链接的时候用到。 (这是我的理解,假如有不对的地方,敬请网上各位大侠指教) 然后,讲讲如何在交叉编译链接的时候找到需要的库。

(1)、交叉编译时候直接使用-L和-I参数指定搜索非标准的库文档和头文档的路径。例如:

arm-linux-gcc test.c -L/usr/local/arm/2.95.3/arm-linux/lib -I/usr/local/arm/2.95.3/arm-linux/include

(2)、使用ld.so.conf文档,将用到的库所在文档目录添加到此文档中,然后使用ldconfig命令刷新缓存。

(3)、使用如下命令:

$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/arm/2.95.3/arm-linux-lib

参见《ld.so.conf 文档和PKG_CONFIG_PATH变量》这篇文章。

通过环境变量LD_LIBRARY_PATH指定动态库搜索路径(!)。

通过设定环境变量LD_LIBRARY_PATH也可以指定动态库搜索路径。当通过该环境变量指定多个动态库搜索路径时,路径之间用冒号\":\"分隔。

不过LD_LIBRARY_PATH的设定作用是全局的,过多的使用可能会影响到其他应用程序的运行,所以多用在调试。(LD_LIBRARY_PATH的缺陷和使用准则,可以参考《Why LD_LIBRARY_PATH is bad》 )。通常情况下推荐还是使用gcc的-R或-rpath选项来在编译时就指定库的查找路径,并且该库的路径信息保存在可执行文件中,运行时它会直接到该路 径查找库,避免了使用LD_LIBRARY_PATH环境变量查找。

(4)、交叉编译时使用软件的configure参数。例如我编译minigui-1.3.3,使用如下配置:

#!/bin/bash

rm -f config.cache config.status

./configure --build=i686-linux --host=arm-linux --target=arm-linux \\

CFLAGS=-I/usr/local/arm/2.95.3/arm-linux/include \\

LDFLAGS=-L/usr/local/arm/2.95.3/arm-linux/lib \\

--prefix=/usr/local/arm/2.95.3/arm-linux \\

--enable-lite \\

--disable-galqvfb \\

--disable-qvfbial \\

--disable-vbfsupport \\

--disable-ttfsupport \\

--disable-type1support \\

--disable-imegb2312py \\

--enable-extfullgif \\

--enable-extskin \\

--disable-videoqvfb \\

--disable-videoecoslcd

这里我配置了CFLAGS和LDFLAGS参数,这样一来,我就不用去修改每个Makefile里-L和-I参数了,也不用再去配置LD_LIBRARY_PATH或改写ld.so.conf文档了。Linux下动态库使用小结

1. 静态库和动态库的基本概念

静态库,是在可执行程序连接时就已经加入到执行码中,在物理上成为执行程序的一部分;使用静态库编译的程序运行时无需该库文件支持,哪里都可以用,但是生成的可执行文件较大。动态库,是在可执行程序启动时加载到执行程序中,可以被多个可执行程序共享使用。使用动态库编译生成的程序相对较小,但运行时需要库文件支持,如果机器里没有这些库文件就不能运行。

2. 如何使用动态库

如何程序在连接时使用了共享库,就必须在运行的时候能够找到共享库的位置。linux的可执行程序在执行的时候默认是先搜索/lib和/usr/lib这两个目录,然后按照/etc/ld.so.conf里面的配置搜索绝对路径。同时,Linux也提供了环境变量LD_LIBRARY_PATH供用户选择使用,用户可以通过设定它来查找除默认路径之外的其他路径,如查找/work/lib路径,你可以在/etc/rc.d/rc.local或其他系统启动后即可执行到的脚本添加如下语句:LD_LIBRARY_PATH =/work/lib:$(LD_LIBRARY_PATH)。并且LD_LIBRARY_PATH路径优先于系统默认路径之前查找(详细参考《使用LD_LIBRARY_PATH》)。

不过LD_LIBRARY_PATH的设定作用是全局的,过多的使用可能会影响到其他应用程序的运行,所以多用在调试。(LD_LIBRARY_PATH的缺陷和使用准则,可以参考《Why LD_LIBRARY_PATH is bad》 )。通常情况下推荐还是使用gcc的-R或-rpath选项来在编译时就指定库的查找路径,并且该库的路径信息保存在可执行文件中,运行时它会直接到该路径查找库,避免了使用LD_LIBRARY_PATH环境变量查找。

3.库的链接时路径和运行时路径

现代连接器在处理动态库时将链接时路径(Link-time path)和运行时路径(Run-time path)分开,用户可以通过-L指定连接时库的路径,通过-R(或-rpath)指定程序运行时库的路径,大大提高了库应用的灵活性。比如我们做嵌入式移植时#arm-linux-gcc $(CFLAGS) –o target –L/work/lib/zlib/ -llibz-1.2.3 (work/lib/zlib下是交叉编译好的zlib库),将target编译好后我们只要把zlib库拷贝到开发板的系统默认路径下即可。或者通过-rpath(或-R )、LD_LIBRARY_PATH指定查找路径。

小问题:

1.编译时的-L选项是否影响LD_LIBRARY_PATH的值?

举一个实例:

当前文件夹结构如下:

test.c tools/

tool下有tool.c tool.h my_err.h 以及由此生成的libtool.so

tool下编译生成库文件

gcc -Wall -g -shared -o tool.so tool.c

在当前文件夹引用:

gcc -Wall -g –o test.c -Ltools -ltool

编译不报错,但是运行加载的时候就出现cannot open shared object file。

如果将该库文件拷贝到/usr/lib下就没有错误,正常运行。

说明编译时的-L选项并不影响环境变量LD_LIBRARY_PATH,-L只是指定了程序编译连接时库的路径,并不影响程序执行时库的路径,系统还是会到默认路径下查找该程序所需要的库。

原文

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/273036.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[NBUT 1458 Teemo]区间第k大问题,划分树

裸的区间第k大问题&#xff0c;划分树搞起。 #pragma comment(linker, "/STACK:10240000") #include <map> #include <set> #include <cmath> #include <ctime> #include <deque> #include <queue> #include <stack> #inc…

Linux的软件包封装格式有,linux软件安装包详解---全

详细介绍了常见的四种Linux应用软件安装包及其安装方法。一、解析Linux应用软件安装包&#xff0c;通常Linux应用软件的安装包有四种&#xff1a;1) tar包&#xff0c;如software-1.2.3-1.tar.gz。他是使用UNIX系统的打包工具tar打包的。2) rpm包&#xff0c;如software-1.2.3-…

人生的第一个博客(●'◡'●)ノ♥--开博典礼

嘛&#xff0c;说实话&#xff0c;现在才开始&#xff0c;实在是有点晚了&#xff0c;一不小心大学都过去1年了_(:3 」∠)_ 我在专业方面的起步也是相当晚的&#xff0c;身为计算机专业&#xff0c;编程却从大学才开始正式接触&#xff0c;进入大学时其他方面的能力也都约等于0…

linux查看运行钟的tomcat,linux查看tomcat启动运行日志

Linux0&period;11内核--进程调度分析之2&period;调度[版权所有,转载请注明出处.出处:http://www.cnblogs.com/joey-hua/p/5596830.html ] 上一篇说到进程调度归根结底是调用timer_interrupt函数, ...iReport 下载地址iReport 下载地址: https://osdn.jp/projects/sfnet…

8月面试题目收录

面试题收录 常见兼容性问题&#xff1f; * png24位的图片在iE6浏览器上出现背景&#xff0c;解决方案是做成PNG8.* 浏览器默认的margin和padding不同。解决方案是加一个全局的*{margin:0;padding:0;}来统一。* IE6双边距bug:块属性标签float后&#xff0c;又有横行的margin情况…

linux如何升级php版本升级,Linux 升级php版本

近来因工作需要,又没有服务器维护人员,只能自己上阵啦。从php5.3.28->5.5.30,先自己下载php包到/usr/local/下​&#xff0c;# 解压缩安装包tar zxvf php-5.5.30.tar.gz# 进入目录cd php-5.5.30// 编译的时候一定要加入参数--enable-fpm#./configure --prefix/usr/local/php…

opencv配置

OpenCV的简单安装和一次性配置在这里就不赘述了&#xff0c;网上教程很多&#xff0c;可以参考一下这个链接里面的教程http://wenku.baidu.com/view/3b40de25453610661ed9f46b.html。 但是很多情况下面&#xff0c;我们新建一个项目就要重新配置一次OpenCV&#xff0c;那就相当…

linux ftp 工作过程,linux中ftp的安装过程记录[运维篇]

安装FTP的全过程记录&#xff0c;对于相同情况希望有所帮助。【centOS】1、查询本机是否安装vsftpd: rpm -qa |grep vsftpd &#xff1b;2、安装ftp服务 yum install vsftpd;3、开启ftp服务 chkconfig vsftpd on&#xff0c;开机启动&#xff1b;4、手动操作ftp服务&#xff0c…

代码命名,代码里的命名规则:错误的和正确的对比 命名方法总结 “自我描述的源代码”用代码表达出你的思想,让其他人通过代码能明白你的意图。...

http://www.aqee.net/express-names-in-code-bad-vs-clean/ 编程初学者总是把大量的时间用在学习编程语言&#xff0c;语法&#xff0c;技巧和编程工具的使用上。他们认为&#xff0c;如果掌握了这些技术技巧&#xff0c;他们就能成为不错的程序员。然而&#xff0c;计算机编程…

linux 动态执行cp,Linux常用命令之cp、mv、rm、cat、more、head、tail、ln命令讲解

上一章节中&#xff0c;我们了解到了Linux系统的最基础的几个文件处理命令&#xff0c;核心的是ls命令&#xff0c;在今天这章中&#xff0c;我们来继续学习Linux对于文件操作相关的一些命令&#xff0c;比如复制、移动、删除、查看等命令。1、cp 命令解释命令名称&#xff1a;…

使用DBI(perl)实现文本文件的导入导出mysql

DBI 是perl脚本连接数据库的一个模块。perl脚本相对shell更灵活&#xff0c;功能更强大&#xff0c;跨平台能力强。相对可执行jar包要简单很多。 ​1、下载安装包DBI-1.631.tar.gzperl脚本下载的网站http://www.cpan.org/ 很多perl的组件都可以在这个网站上下载 2、解压tar -xz…

linux 车载视频监控,基于Linux平台车载视频监控系统研发-计算机科学与技术专业论文.docx...

基于Linux平台车载视频监控系统研发-计算机科学与技术专业论文目录HYPERLINK \l "_bookmark0" 第一章 绪论1 HYPERLINK \l "_bookmark1" 1.1 研究背景1 HYPERLINK \l "_bookmark2" 1.2 研究动态1 HYPERLINK \l "_bookmark3" 1.3 本文工…

Linux鼠标回报率修改,鼠标回报率怎么调? 设置鼠标回报率的三种方法

鼠标回报率如何设置呢&#xff1f;鼠标回报率又称刷新率&#xff0c;是指鼠标MCU与电脑传输数据频率。鼠标回报率对于游戏玩家而言至关重要&#xff0c;但同时鼠标回报率与电脑性能息息相关。只有电脑硬件性能良好&#xff0c;才能适当提升鼠标回报率&#xff0c;以实现更高的鼠…

linux下vi修改文件用法

进入vi的命令 vi filename :打开或新建文件&#xff0c;并将光标置于第一行首 vi n filename &#xff1a;打开文件&#xff0c;并将光标置于第n行首 vi filename &#xff1a;打开文件&#xff0c;并将光标置于最后一行首 vi /pattern filename&#xff1a;打开文件&#xff…

linux在芯片设计与实现,基于Linux的Atheros无线芯片网卡驱动的设计与实现

Design and Implementation of Linux based Atheros wireless network cards driverDU Qingbo1杜清波(1985-)&#xff0c;男&#xff0c;硕士研究生&#xff0c;主要研究方向&#xff1a;嵌入式系统与网络通信1、School of Computer Science,Beijing University of Posts and T…

[转载]孙婧妍:高考语文148分是这样炼成的(附:孙婧妍

原文地址&#xff1a;孙婧妍&#xff1a;高考语文148分是这样炼成的(附&#xff1a;孙婧妍2013高考作文《手机论》)作者&#xff1a; 语文新高考高考语文148分是这样炼成的 (附&#xff1a;孙婧妍2013高考作文《手机论》) 来源&#xff1a;网络 作者&#xff1a;孙婧妍…

linux ps 命令安装,Linux上安装pstree命令(-bash: pstree: command not found)

一、pstree命令的安装1、在Mac OS上brew install pstree2、在Fedora/Red Hat/CentOSyum -y install psmisc3、在 Ubuntu/Debianapt-get install psmisc二、pstree命令详解pstree指令用ASCII字符显示树状结构&#xff0c;清楚地表达程序间的相互关系。如果不指定程序识别码或用户…

c语言字符串逆置,字符串逆置

满意答案9n7j5j3m4o2013.12.03采纳率&#xff1a;49% 等级&#xff1a;11已帮助&#xff1a;15198人47911 zxl0714 1358 Accepted 164K 15MS G 0.46K 2007-04-08 10:32:38#include using namespace std;void reverse(char* ch){int i, len;char tmp;len strlen( ch );for (…

哈夫曼编码c语言论文,哈夫曼编码的实现及应用论文.doc

哈夫曼编码的实现及应用论文毕 业 设 计(论文)题目 哈夫曼编码的实现及应用二级学院 数学与统计学院专 业 信息与计算科学班 级学生姓名 张泽欣 学号指导教师 职称时 间目录摘要IAbstractII第一章 绪论11.1 研究目的及意义11.2 图像压缩编码技术概述21.2.1 图像压缩编码技术分类…

css笔记3

CSS 多类选择器,通过把两个类选择器链接在一起&#xff0c;仅可以选择同时包含这些类名的元素&#xff08;类名的顺序不限&#xff09;。 <p class"important warning"> This paragraph is a very important warning. </p>.important {font-weight:bold;…