linux编程头文件所在路径的问题
一、问题引入
1、头文件与库
当我们在PC主机linux环境下(如ubuntu),编写linux应用程序,然后利用gcc来编译。在源代码的开始位置会写入头文件,那是因为我们使用了系统提供的库函数,例如printf、open、read、write等等。我们会写入类似的内容:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
......
我们的应用程序代码编译过程大概是这样的:编译器根据头文件提供的库函数接口形式,来编译我们的代码(如果不知道调用库函数的形式,eg:参数个数、形式、返回值类型等,将无法对库函数调用的代码进行编译),然后生成目标文件;然后,再使用链接器将这个目标文件与系统库链接;最终生成我们需要的应用程序。所以,其实我们的代码包含了自己写的内容,还有系统为我们提供好的现成的库函数,整个结合起来才形成一个完整的程序。
库函数的头文件,在编译的时候被使用,而库函数的代码段(库文件),在链接的时候被使用。
example:
应用程序代码在使用一个系统调用的时候,例如printf()函数,需要指定包含的头文件stdio.h;另外,在链接的时候对应的链接libc.a(笔者电脑文件所在目录:/usr/lib/i386-linux-gnu/libc.a)。
总结一下,我们编写应用程序,需要使用linux系统提供的库函数。具体实现起来,需要头文件和库文件。头文件是需要我们编写应用程序的时候,在源文件开头添加的;而库文件则需要配置编译环境进行指定搜索目录。
2、头文件和库文件在哪儿?
编写linux本机的应用程序、目标开发板的应用程序以及目标开发板的驱动,都会使用库函数,那么这些情况的头文件和库文件在哪儿放着呢?
不知道这个问题,在编写代码时会有疑惑。比如说,编写目标开发板的应用程序时,使用了open、read、write等函数。于是,想在linux内核开发的源码包(驱动开发环境)里边找到这些函数的完整代码,或者降低要求,查看头文件里的函数声明。结果令人失望,找不到需要的头文件能提供这样的函数声明。这样造成我们不知道该如何使用这些库函数。
事实情况是,上边列出常见的3种编程情况,所使用的头文件和库文件位置都不一样。也就是说,上述3种编程情况,所使用的库函数调用有可能是相同的,但是库函数所在的头文件以及对应的库,所在的位置却不一样。所以,编写目标开发板的应用程序时,在内核开发的源码包(驱动开发环境)中,找不到我们需要的头文件。
下面,根据不同的编程情况,进行说明。
二、编写linux本机的应用程序
查看命令
#echo 'main(){}'|gcc -E -v -
显示结果
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/i686-linux-gnu/4.6/lto-wrapper
Target: i686-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 4.6.3-1ubuntu5' --with-bugurl=file:///usr/share/doc/gcc-4.6/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.6 --enable-shared --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.6 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --enable-plugin --enable-objc-gc --enable-targets=all --disable-werror --with-arch-32=i686 --with-tune=generic --enable-checking=release --build=i686-linux-gnu --host=i686-linux-gnu --target=i686-linux-gnu
Thread model: posix
gcc version 4.6. (Ubuntu/Linaro 4.6.-1ubuntu5)
COLLECT_GCC_OPTIONS='-E' '-v' '-mtune=generic' '-march=i686'
/usr/lib/gcc/i686-linux-gnu/4.6/cc1 -E -quiet -v -imultilib . -imultiarch i386-linux-gnu - -mtune=generic -march=i686 -fstack-protector
ignoring nonexistent directory "/usr/local/include/i386-linux-gnu"
ignoring nonexistent directory "/usr/lib/gcc/i686-linux-gnu/4.6/../../../../i686-linux-gnu/include"
#include "..." search starts here:
#include <...> search starts here:
/usr/lib/gcc/i686-linux-gnu/4.6/include
/usr/local/include
/usr/lib/gcc/i686-linux-gnu/4.6/include-fixed
/usr/include/i386-linux-gnu
/usr/include
End of search list.
# "<stdin>"
# "<built-in>"
# "<command-line>"
# "<stdin>"
main{}
COMPILER_PATH=/usr/lib/gcc/i686-linux-gnu/4.6/:/usr/lib/gcc/i686-linux-gnu/4.6/:/usr/lib/gcc/i686-linux-gnu/:/usr/lib/gcc/i686-linux-gnu/4.6/:/usr/lib/gcc/i686-linux-gnu/
LIBRARY_PATH=/usr/lib/gcc/i686-linux-gnu/4.6/:/usr/lib/gcc/i686-linux-gnu/4.6/../../../i386-linux-gnu/:/usr/lib/gcc/i686-linux-gnu/4.6/../../../../lib/:/lib/i386-linux-gnu/:/lib/../lib/:/usr/lib/i386-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/i686-linux-gnu/4.6/../../../:/lib/:/usr/lib/
COLLECT_GCC_OPTIONS='-E' '-v' '-mtune=generic' '-march=i686'
可见头文件的搜索路径如下(具体搜索路径,要看个人的实际情况,以命令运行的结果为准):
/usr/lib/gcc/i686-linux-gnu/4.6/include
/usr/local/include
/usr/lib/gcc/i686-linux-gnu/4.6/include-fixed
/usr/include/i386-linux-gnu
/usr/include
三、目标开发板的应用程序
查看命令
#echo 'main(){}'|arm-linux-gcc -E -v -
显示结果
Using built-in specs.
Target: arm-none-linux-gnueabi
Configured with: /scratch/maxim/arm-lite/src-4.3-arm-none-linux-gnueabi-lite/gcc-4.3/configure --build=i686-pc-linux-gnu --host=i686-pc-linux-gnu --target=arm-none-linux-gnueabi --enable-threads --disable-libmudflap --disable-libssp --disable-libstdcxx-pch --with-gnu-as --with-gnu-ld --with-specs='%{funwind-tables|fno-unwind-tables|mabi=*|ffreestanding|nostdlib:;:-funwind-tables}' --enable-languages=c,c++ --enable-shared --enable-symvers=gnu --enable-__cxa_atexit --with-pkgversion='Sourcery G++ Lite 2009q1-176' --with-bugurl=https://support.codesourcery.com/GNUToolchain/ --disable-nls --prefix=/opt/codesourcery --with-sysroot=/opt/codesourcery/arm-none-linux-gnueabi/libc --with-build-sysroot=/scratch/maxim/arm-lite/install-4.3-arm-none-linux-gnueabi-lite/arm-none-linux-gnueabi/libc --with-gmp=/scratch/maxim/arm-lite/obj-4.3-arm-none-linux-gnueabi-lite/host-libs-2009q1-176-arm-none-linux-gnueabi-i686-pc-linux-gnu/usr --with-mpfr=/scratch/maxim/arm-lite/obj-4.3-arm-none-linux-gnueabi-lite/host-libs-2009q1-176-arm-none-linux-gnueabi-i686-pc-linux-gnu/usr --disable-libgomp --enable-poison-system-directories --with-build-time-tools=/scratch/maxim/arm-lite/install-4.3-arm-none-linux-gnueabi-lite/arm-none-linux-gnueabi/bin --with-build-time-tools=/scratch/maxim/arm-lite/install-4.3-arm-none-linux-gnueabi-lite/arm-none-linux-gnueabi/bin
Thread model: posix
gcc version 4.3. (Sourcery G++ Lite 2009q1-)
COLLECT_GCC_OPTIONS='-march=armv4t' '-E' '-v' '-funwind-tables'
/opt/EmbedSky/4.3./bin/../libexec/gcc/arm-none-linux-gnueabi/4.3./cc1 -E -quiet -v -imultilib armv4t -iprefix /opt/EmbedSky/4.3./bin/../lib/gcc/arm-none-linux-gnueabi/4.3./ -isysroot /opt/EmbedSky/4.3./bin/../arm-none-linux-gnueabi/libc - -march=armv4t -funwind-tables
ignoring nonexistent directory "/opt/EmbedSky/4.3.3/bin/../arm-none-linux-gnueabi/libc/usr/local/include"
ignoring duplicate directory "/opt/EmbedSky/4.3.3/bin/../lib/gcc/../../lib/gcc/arm-none-linux-gnueabi/4.3.3/include"
ignoring duplicate directory "/opt/EmbedSky/4.3.3/bin/../lib/gcc/../../lib/gcc/arm-none-linux-gnueabi/4.3.3/include-fixed"
ignoring duplicate directory "/opt/EmbedSky/4.3.3/bin/../lib/gcc/../../lib/gcc/arm-none-linux-gnueabi/4.3.3/../../../../arm-none-linux-gnueabi/include"
#include "..." search starts here:
#include <...> search starts here:
/opt/EmbedSky/4.3./bin/../lib/gcc/arm-none-linux-gnueabi/4.3./include
/opt/EmbedSky/4.3./bin/../lib/gcc/arm-none-linux-gnueabi/4.3./include-fixed
/opt/EmbedSky/4.3./bin/../lib/gcc/arm-none-linux-gnueabi/4.3./../../../../arm-none-linux-gnueabi/include
/opt/EmbedSky/4.3./bin/../arm-none-linux-gnueabi/libc/usr/include
End of search list.
# "<stdin>"
# "<built-in>"
# "<command-line>"
# "<stdin>"
main{}
COMPILER_PATH=/opt/EmbedSky/4.3./bin/../libexec/gcc/arm-none-linux-gnueabi/4.3./:/opt/EmbedSky/4.3./bin/../libexec/gcc/:/opt/EmbedSky/4.3./bin/../lib/gcc/arm-none-linux-gnueabi/4.3./../../../../arm-none-linux-gnueabi/bin/
LIBRARY_PATH=/opt/EmbedSky/4.3./bin/../lib/gcc/arm-none-linux-gnueabi/4.3./armv4t/:/opt/EmbedSky/4.3./bin/../lib/gcc/arm-none-linux-gnueabi/4.3./../../../../arm-none-linux-gnueabi/lib/armv4t/:/opt/EmbedSky/4.3./bin/../lib/gcc/arm-none-linux-gnueabi/4.3./:/opt/EmbedSky/4.3./bin/../lib/gcc/:/opt/EmbedSky/4.3./bin/../lib/gcc/arm-none-linux-gnueabi/4.3./../../../../arm-none-linux-gnueabi/lib/:/opt/EmbedSky/4.3./bin/../arm-none-linux-gnueabi/libc/armv4t/lib/:/opt/EmbedSky/4.3./bin/../arm-none-linux-gnueabi/libc/armv4t/usr/lib/
COLLECT_GCC_OPTIONS='-march=armv4t' '-E' '-v' '-funwind-tables'
可见头文件的搜索路径如下(具体搜索路径,要看个人的实际情况,以命令运行的结果为准):
/opt/EmbedSky/4.3.3/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.3/include
/opt/EmbedSky/4.3.3/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.3/include-fixed
/opt/EmbedSky/4.3.3/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.3/../../../../arm-none-linux-gnueabi/include
/opt/EmbedSky/4.3.3/bin/../arm-none-linux-gnueabi/libc/usr/include
四、linux内核开发(如驱动)
在参考文章《gcc 和 arm-linux-gcc 编译器的默认搜索头文件路径》中,指出由内核编译的Makefile等编译规则指定。我个人觉得编译的头文件得搜索路径,还是应在linux内核开发的源码包中,例如主要集中区include目录下。
参考资料:gcc 和 arm-linux-gcc 编译器的默认搜索头文件路径
linux编程头文件所在路径的问题的更多相关文章
- vs 中明明包含了头文件所在路径,但是却找不到头文件
vs基本不会出错,那么出错的只能是自己了. 哎,又被自己给蠢死了. 你可能在上面两个地方添加好了include 目录,但是却依然编译失败,失败的提示是找不到头文件所在路径,这是为什么呢. 很简单,因为 ...
- linux gcc头文件搜索路径
#include <>: 直接到系统指定的某些目录中去找某些头文件.#include "": 先到源文件所在文件夹去找,然后再到系统指定的某些目录中去找某些头文件 1. ...
- linux 编程头文件搜索规则
包含头文件有两种写法,分别是:#include <stdio.h>#include "stdio.h" <>和""分别表示搜索位置的方式 ...
- linux 查找某文件所在路径
find 路径 -name 文件名 例如:find / -name logo_web.png 查找/路径下logo_web.png文件路径 如果为非root账号可用 sudo find / -nam ...
- Linux C语言头文件搜索路径
本文介绍在linux中头文件的搜索路径,也就是说你通过include指定的头文件,linux下的gcc编译器它是怎么找到它的呢.在此之前,先了解一个基本概念. 头文件是一种文本文件,使用文本编辑器将代 ...
- linux 编译指定库、头文件的路径问题(转)
1. 为什么会出现undefined reference to 'xxxxx'错误? 首先这是链接错误,不是编译错误,也就是说如果只有这个错误,说明你的程序源码本身没有问题,是你用编译器编译时参数用得 ...
- Linux 中C/C++ search path(头文件搜索路径)
https://blog.csdn.net/BjarneCpp/article/details/76135980 起因 我拿到了一套Linux下的C++代码,代码中有这个头文件#include < ...
- linux添加头文件路径
gcc demo.c -o demo -I/tools/libevent/include -L/tools/libevent/lib -levent -I:头文件目录 -L:静态库目录 -l:静态库 ...
- Linux查看文件安装路径与文件所在路径
一.查看文件安装路径: 由于软件安装的地方不止一个地方,所有先说查看文件安装的所有路径(地址). 这里以Oracle为例.比如说我安装了Oracle,但是不知道文件都安装在哪些地方.放在哪些文件夹里, ...
随机推荐
- mysql之行(记录)的详细操作
在Mysql管理软件中, 可以通过sql语句中的dml语言来实现数据的操作, 包括 使用INSERT实现数据的插入 UPDATE实现数据的更新 使用DELETE实现数据的删除 使用SELECT查询数据 ...
- Ansible--inventory
简介 Inventory 是 Ansible 管理主机信息的配置文件,相当于系统 HOSTS 文件的功能,默认存放在 /etc/ansible/hosts.为方便批量管理主机,便捷使用其中的主机分组, ...
- (后端)注意hibernate中对象的set方法修改数据库
2017-10-16 公司里面其他人发现了一个问题,五粮液金品库存出现了问题,删除了库存也没还回来,一瓶一千多.而且在我的功能块,在我看出货详情的时候,诡异的事情发生了,第一眼看上去没问题呀,刷新了一 ...
- C#微信公众号开发——获取access_token
access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token.正常情况下access_token有效期为7200秒(两个小时),微信获取access_token接 ...
- 通过日志过滤的方法,统计每天内容详情页面的PV数
1.目的: 每天凌晨0点1分统计用户点击进入内容详情页的次数,对内容点击量形成榜单. 2.分析: A./data/log/epg.access.log日志实时打印用户访问页面的日志,并且每天凌晨0点会 ...
- 说说Android6.0动态申请权限的那些坑
白天在做SDK23版本的适配,遇到了不少坑,现在抽空记下来,以此为戒. 首先要知道哪些坑,就得先了解一些定义和基本使用方式. 那么先介绍一下动态申请的权限分组情况. 下面的权限组是由谷歌官方定义的,目 ...
- 初识Python - Python的历史(转)
声明: 本文转自维基百科 如有意见请联系删除 综述 该编程语言 的Python是在20世纪80年代末的设想,和实施是在1989年12月开始由吉多·范罗苏姆在CWI在荷兰的继任者农行能够异常处理,并与接 ...
- Alpha版本 - 用户反馈
Alpha版本 - 用户反馈 使用情况 (前天发出了内测apk给身边的人小范围使用,到目前共有31名用户使用过产品) 新增用户数: 用户事件数: Bug反馈 登录/注册出现"无响应" ...
- 支付宝alipay移动支付
通过支付宝提供的API实现移动支付功能 一:下载相关的依赖和工具 蚂蚁金服 https://open.alipay.com/platform/home.htm 移动支付开发文档 https://doc ...
- Intent加强
Intent是一种运行时绑定(runtime binding)机制,它能在程序运行的过程中连接两个不同的组件.通过Intent,你的程序可以向Android表达某种请求或者意愿,Android会根据意 ...