技术标签: linux交叉编译头文件
7th of March 2013
头文件的查找方式和库的搜索路径
作者:程姚根,华清远见嵌入式学院讲师。
对于以压缩包发布的软件,在它的目录下通常都有一个配置脚本configure,它的作用确定编译参数(比如头文件位置、连接库位置等),然后生成Makefile以编译程序。可以进入该软件的目录,执行"./configure --help"命令查看使用帮。
一个程序能正确编译、链接、运行需要满足3个条件:预处理时能找到头文件,连接时能找到库,运行时能找到库。下面分别介绍:
1.指定头文件位置
在程序中常用两种方法来包含头文件:
#include
#include "headerfile.h"
他们的区别是,对于第二种方法,首先在源文件当前目录下查找头文件,如果找不到,再像第一种方法一样去编译命令指定、系统预设的目录去找。这些"指定的"、"预设的"目录在什么地方呢?"指定的"头文件目录是编译程序时使用"-I"指定目录,"预设的"的头文件目录是由编译器自己决定的。通过一个例子可以看到这点,执行一下命令:
mkdir -p /work/AAA/include /*临时目录,测试用*/
mkdir -p /work/BBB/include /*临时目录,测试用*/
export C_INCLUDE_PATH=/work/AAA/include
echo 'main() {}' | arm-linux-gcc -I/work/BBB/include -E -v -
得到以下输出内容,从中可以看到查找头文件时的路径及优先顺序:
...
#include "....." search starts here:
#include <.....> search starts here:
/work/BBB/include
/work/AAA/include
...
可以总结出头文件的查找路径及优先顺序。
1.如果源文件中使用双引号来包含头文件,则首先在源文件当前目录查找头文件。
2.如果编译时使用"-I/some/dir",则在/some/dir中查找。
3.如果设置了环境变量C_INCLUDE_PATH,则在指定的目录中查找。
4.最后在编译器预设的路径中查找,这是不需要指定的。
所以,编译程序时如果出现了找不到头文件的错误,可以通过设置C_INCLUDE_PATH或给编译器设置"-I"选线来指定头文件目录,这可以在执行配置命令configure之前设置C_INCLUDE_PATH或CFLAGS,如果不设置CFLAGS,它的默认值为"-g -O2",比如:
export C_INCLUDE_PATH="/some/dir/1:/some/dir/2"
export CFLAGS = "-g -O2 -I/some/dir" #如果设置了C_INCLUDE_PATH,就可以不设置CFLAGS
./configure
还有更好的方法,当明确知道要使用哪个动态库时,可以通过pkg-config命令获知要使用这个库时编译时的参数、连接时的参数。
先执行一下命令体验一下:
export PKG_CONFIG_PATH=/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib/pkgconfig
pkg-config --cflags uuid
-I/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/include
交叉编译时库的搜索路径
1.“-L”指定连接时库的搜索路径,这些库使用"-l"来显示指定,比如"-labc"表示的库文件为libabc.so
2."-rpath-link"比"-L"多一项功能,它指定的目录还可以用于搜索依赖库。
3."-rpath"比"-rpath-link"多一项功能,它指定的目录会被编译进程序中,当程序运行时,首先从这些目录中寻找库。
怎样指定"-rpath-link"呢?连接器arm-linux-ld通常是由arm-linux-gcc间接启动的,而arm-linux-gcc并不认识"-rpath-link"选项,所以需要在前面加上关键字"-Wl",表示选项用于连接器。在执行配置命令configure之前设置LDFLAGS即可,比如:
export LDFLAGS="-Wl,-rpath-link-Wl,/work/crossbuild/X/lib -Wl,-rpath-link-Wl,/work/corssbuild/GTK/lib"
./configure
指定运行时库的位置
运行库时的查找路径及优先顺序如下: 1.编译时使用"-rpath"指定目录。
2.环境变量LD_LIBRARY_PATH指定的目录(它可以指定多个目录,以冒号分隔)。
3.默认路径:/lib、/usr/lib.
文章浏览阅读1.6k次。在执行单元测试时,ApplicationRunner被意外启动,导致了Netty服务器被初始化,单元测试无法执行的问题。解决方案:通过设置ApplicationRunner对应Bean的Profile解决对应组件添加注解:@Profile("!test")单元测试添加注解:@ActiveProfiles("test")..._applicationrunner解决
文章浏览阅读748次。/*文章很长,能看完的少走一个月弯路,绝不抖机灵*/这篇文章是为了介绍自己自学用过的Java视频资料。本套整合教程总共180+G,共450+小时。考虑到绝大部分视频至少要看两遍,而且视频总时长并不代表学习时长,所以零基础初学者总学习时间大约为:600小时视频时长 + 100小时理解 + 100小时练习,至少需要800小时。你可能觉得自己能一天学习8小时,实际上平均下来每天能学4小时都算厉害了。总会有各种原因,比如当天内容太难,公司聚会,要出差等等。如果周末你也是坚持学习,那么最理想状况下,6_java 岗位找工作容易
文章浏览阅读1.5k次,点赞27次,收藏14次。文章目录一:线性表1.1 顺序表1.1.1 接口实现1.2 链表1.2.1 链表与数组的区别1.2.2 结构体的自引用1.2.3 链表的分类一:线性表线性表是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构,常见的线性表有:顺序表,链表,栈,队列,字符串等。线性表在逻辑上是线性结构,也就是说是一条连续的实线,但其实在物理结构上不一定连续,其中线性表在储存的时候,通常以数组和链式结构的形式存储。1.1 顺序表顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性_什么是顺序表?什么是链表?
文章浏览阅读2.1k次。一.今天发现 Valine 评论系统不见了,没法使用啦,发现原来是valine里的av -min.js检查不到的原因。官方也给了说法,是因为 leancloud.cn 以及 …lncld.net 域名不能解析了。那我的解决方法是什么呢??首先,我找到了av -min.js和valine.min.js的源码。源码链接如下: av -min.js valine.min.js接下来我们在我们的github.io上/js下新建两个js文件,分别是av -min.js和valine.min.js然_code 403: 访问被api域名白名单拒绝,请检查你的安全域名设置
文章浏览阅读280次。1、config.php配置文件里配置七牛云密钥等里面 secretKey accessKey domain bucket对应换成自己七牛云申请的,步骤:(1)七牛云注册成功后—对象存储申请10G免费空间,(2)右上角个人中头像image.pngimage.png//配置文件return [// 文件上传默认驱动'UPLOAD_DRIVER' => 'Qiniu', //设置七牛上传驱动//..._lkqtp
文章浏览阅读788次。目录贪心算法的思想贪心算法的基本要素 最优子结构 贪心选择性质贪心算法与动态规划算法的差异贪心算法的一般理论相关例题 活动安排问题 哈夫曼编码 最小生成树问题贪心算法的思想贪心算法总是作出在当前看来最好的选择。也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择。当然,希望贪心算法得到的最终结果也是整体最优的。虽然贪心算法不能对所有问题都得到整体最..._贪心算法如何跳出局部最优 知乎
文章浏览阅读472次。小编给大家分享一款多行业万能预约门店小程序源码系统。该系统不仅具备高度的可定制性,还提供了丰富的功能模块,能够轻松应对不同行业的预约需求。:该系统支持多行业预约需求,无论是美容美发、餐饮娱乐还是医疗健身等行业,都能找到适合的预约模板和功能模块。:该系统提供了完整的搭建教程和安装代码包,用户只需按照教程操作,即可轻松完成小程序的搭建和部署。:系统提供了丰富的数据分析和统计功能,可以帮助商家了解预约情况、客户分布等信息,为门店运营提供有力支持。同时,还支持预约提醒功能,确保客户能够按时到店,提高预约的准确率。
文章浏览阅读2.1w次,点赞23次,收藏42次。相信用过antd的同学基本都用过select下拉框了,这个组件数据量少的时候很好用,但是当数据量大的时候,比如大几百条上千条甚至是几千条的时候就感觉一点都不好用了,卡的我怀疑人生,一点用户体验都没有了。当然这不是我想去优化它的动力,主要是公司业务人员和后端的同事也无法忍受,于是我只能屈从于他们的淫威。。。。想要优化肯定要知道为什么会卡,初步判断就是数据量过大导致渲染option组件的时间过长导致卡..._select 数据量太大
文章浏览阅读120次。通过本文的介绍,我们了解了如何使用MQTT.fx与百度天工物接入平台对接嵌入式设备。首先,我们注册了百度天工账号并创建了物接入应用;最后,我们通过订阅和发布消息的方式实现了与百度天工物接入平台的数据交互。在这个背景下,百度推出了天工物接入平台,为开发者提供了简单、高效的物联网设备连接方案。MQTT.fx是一款开源的MQTT客户端工具,它支持多种操作系统,并提供了直观的用户界面,方便开发者进行MQTT消息的订阅和发布操作。百度天工物接入平台是百度基于物联网技术推出的一款用于连接和管理物联网设备的平台。_百度天工mqtt还能用嘛
文章浏览阅读1.4k次,点赞33次,收藏31次。1、前言Normalizingflow\boxed{Normalizing \hspace{0.1cm} flow}Normalizingflow,流模型,一种能够与目前流行的生成模型——GAN、VAE\boxed{\mathbf{GAN、VAE}}GAN、VAE相媲美的模型。其也是一个生成模型,可是它的思路和另外两个的迂回策略却很大不同。本文我们就简单来介绍一个这个模型吧2、引入在生成模型中,我们的目的就是计算出数据x的概率分布。然而,数据的分布总是千奇百怪的。其无法被定义,无法被观测,无法被_normalizing flow
文章浏览阅读1.8w次,点赞34次,收藏141次。2020年9月至11月初,本人用两个月的时间来备考【系统架构设计师】这一科目,最终以综合题 59/75 案例 57/75 论文 53/75 的成绩顺利通过。备考过程中,发现由于这个考试比较冷门,遇到了【学习资料少】、【备考方向不明确】等问题,走了不少弯路。因此想分享一下备考中的干货,帮助想要备考【系统架构设计师】的同学。_系统架构师复习攻略
文章浏览阅读9.1k次,点赞21次,收藏26次。深层模型和柔性设计并非唾手可得。想要取得进展,必须学习大量领域知识并进行充分的讨论,还需要经历大量的尝试和失败。在实际的研究领域问题实践时,有一些成熟的模式可以供我们借鉴和套用。这样我们可以从这个起点来重构和试验,虽然它们不是现成的解决方案。