linux编程头文件所在路径的问题

摘要:
库函数用于为Linux本机计算机、目标开发板和目标开发板驱动程序编写应用程序。在这些情况下,头文件和库文件在哪里?因此,如果您想在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.3 (Ubuntu/Linaro 4.6.3-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.
# 1 "<stdin>"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "<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.3 (Sourcery G++ Lite 2009q1-176) 
COLLECT_GCC_OPTIONS='-march=armv4t' '-E' '-v' '-funwind-tables'
 /opt/EmbedSky/4.3.3/bin/../libexec/gcc/arm-none-linux-gnueabi/4.3.3/cc1 -E -quiet -v -imultilib armv4t -iprefix /opt/EmbedSky/4.3.3/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.3/ -isysroot /opt/EmbedSky/4.3.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.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
End of search list.
# 1 "<stdin>"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "<stdin>"
main{}
COMPILER_PATH=/opt/EmbedSky/4.3.3/bin/../libexec/gcc/arm-none-linux-gnueabi/4.3.3/:/opt/EmbedSky/4.3.3/bin/../libexec/gcc/:/opt/EmbedSky/4.3.3/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.3/../../../../arm-none-linux-gnueabi/bin/
LIBRARY_PATH=/opt/EmbedSky/4.3.3/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.3/armv4t/:/opt/EmbedSky/4.3.3/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.3/../../../../arm-none-linux-gnueabi/lib/armv4t/:/opt/EmbedSky/4.3.3/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.3/:/opt/EmbedSky/4.3.3/bin/../lib/gcc/:/opt/EmbedSky/4.3.3/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.3/../../../../arm-none-linux-gnueabi/lib/:/opt/EmbedSky/4.3.3/bin/../arm-none-linux-gnueabi/libc/armv4t/lib/:/opt/EmbedSky/4.3.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编程头文件所在路径的问题》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇scala对复杂json的处理SVN搭建下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

linux patch 格式与说明(收录)

转:http://blog.chinaunix.net/uid-26813001-id-3282954.html 首先介绍一下diff和patch。在这里不会把man在线文档上所有的选项都介绍一下,那样也没有必要。在99%的时间里,我们只会用到几个选项。所以必须学会这几个选项。1、diff--------------------NAMEdiff - fin...

linux 下将tomcat注册成服务并开机启动

一、将startup.sh和shutdown.sh新建软连接到/usr/bin ln -s /usr/local/apache-tomcat-8.5.38/bin/startup.sh /usr/bin/startup.sh ln -s /usr/local/apache-tomcat-8.5.38/bin/shutdown.sh /usr/bin/shu...

Linux网络编程 select/epoll得知socket有数据可读,如何判断数据全部被读取完毕?

补充一点:只有在使用epoll ET(Edge Trigger)模式的时候,才需要关注数据是否读取完毕了。使用select或者epoll的LT模式,其实根本不用关注数据是否读完了,select/epoll检测到有数据可读去读就OK了。 这里有两种做法: 1. 针对TCP,调用recv方法,根据recv方法的返回值,如果返回值小于我们指定的recv buf...

gdb调试程序函数名为问号,什么原因?step by step解决方案

gdb调试程序函数名为问号,什么原因? http://bbs.chinaunix.net/thread-1823649-1-1.html http://www.bubuko.com/infodetail-1877415.html 其实就是3个原因:源代码和可执行程序版本不一致;没有符号表,这不只是-g加上就万能,还可能涉及到具体的编译选项比如-g2 -gd...

linux下为目录和文件设置权限

Linux下为目录和文件设置权限,包括子目录的循环递归设置 chmod 命令可以改变所有子目录的权限,下面有2种方法 改变一个文件的权限: chmod mode file|dir 改变所有子目录的权限: chmod mode dir -R 注意后面加了个-R参数 参数就是权限模式 mode = 777 or 752 ,666,,, mode 的三...

关于Ubuntu18.04 linux系统使用安装JDK Mysql

平台部署 一、安装JDK step1.下载OracleJDKstep2.解压step3.加入环境变量 具体操作如下: lemon@ubuntu:~$ cd ~/download/ lemon@ubuntu:~/download$ wget http://download.oracle.com/otn-pub/java/jdk/8u191-b12/2787...