`
shixiaomu
  • 浏览: 384064 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

linux 编译错误详解

 
阅读更多
编译错误详解

头文件:

1.在编译时,我们可以用-I(i的大写)选项来指定头文件所在的目录
在-I后可以有空格也可以没有空格,另外也可以指定多个目录
gcc main.c -I ./ -I ./include/


2.设置gcc的环境变量C_INCLUDE_PATH、CPLUS_INCLUDE_PATH 、CPATH。
export C_INCLUDE_PATH=$C_INCLUDE_PATH:/usr/include/xgytest


3.查找默认的路径/usr/include   /usr/local/include等



总结一下gcc在编译源码时是如何寻找所需要的头文件的:

   1.  首先gcc会从-Idir   -isystem dir   -Bprefix    -sysroot  dir     --sysroot=dir    -iquote dir选项指定的路径查找(这些选项先指定的会先搜索,有特例的情况请参考前面的链接)

   2. 然后找gcc的环境变量:C_INCLUDE_PATH、CPLUS_INCLUDE_PATH 、CPATH、GCC_EXEC_PREFIX等。(这些环境变量搜索的先后顺序不确定,有待确认)

   3. 然后查找GCC安装的目录(可以通过gcc  -print-search-dirs查询)

   4.  然后再按照下面列出的顺序查找系统默认的目录:/usr/include      /usr/local/include

库文件:

   用ldd命令可以查看一个可执行文件依懒于哪些库 @@@@@@@@@@@@@@@@@@@@@@@@
   编译时,编译器不会查找LD_LIBRARY_PATH,还有/etc/ld.so.conf文件中指定的路径 @@@@@@@@@@@@@@@@@@@@@@@@
  
   现代连接器在处理动态库时将链接时路径(Link-time path)和运行时路径(Run-time path)分开,用户可以通过-L指定连接时库的路径,通过-R(或-rpath)指定程序运行时库的路径,大大提高了库应用的灵活性。
  
   Linux下 的库文件在命名时有一个约定,那就是库文件应该以lib三个字母开头,由于所有的库文件都遵循了同样的规范,因此在用-l(L的小写字母)选项指定链接的库文件名时可以省去 lib三个字母,也就是说GCC在对-lfoo进行处理时,会自动去链接名为libfoo.so的文件
   注意-lpos, 这里的-l是L的小写,另外也可以写成-l  pos即中间有一个空格,但有没有空格是有一点区别的,有空格的只搜索与POSIX兼容的库,一般建议使用没有空格的。
  
  
    程序在编译链接时,编译器是按照如下顺序来查找动态链接库(共享库)和静态链接库的:
   
    编译时,编译器不会查找LD_LIBRARY_PATH,还有/etc/ld.so.conf文件中指定的路径 @@@@@@@@@@@@@@@@@@@@@@@@

    1.  gcc会先按照-Ldir    -Bprefix选项指定的路径查找

    2. 再找gcc的环境变量GCC_EXEC_PREFIX

    3. 再找gcc的环境变量LIBRARY_PATH

    4. 然后查找GCC安装的目录(可以通过gcc  -print-search-dirs查询)

    5.  然后查找默认路径/lib

    6.  然后查找默认路径/usr/lib

    7.  最后查找默认路径/usr/local/lib

    8.  在同一个目录下,如果有相同文件名的库(只是后缀不同),那么默认链接的是动态链接库,可以用-static选项显示的指定链接静态库。
  
  
运行:
    在这里我没有提到头文件的查找,因为头文件只在编译的时候才会用到,编译完后就不需要头文件了!
   
    另外,这里的库指的是动态链接库,静态链接库在链接后是不需要了的,因为链接时链接器会把静态库中的代码插入到相应的函数的调用处,所以程序在运行时不再需要静态库
   
     程序运行时动态库的搜索路径搜索的先后顺序是:

    1.编译目标代码时指定的动态库搜索路径(指的是用-wl,rpath或-R选项而不是-L);

    example: gcc -Wl,-rpath,/home/arc/test,-rpath,/lib/,-rpath,/usr/lib/,-rpath,/usr/local/lib test.c

    2.环境变量LD_LIBRARY_PATH指定的动态库搜索路径;

    3.配置文件/etc/ld.so.conf中指定的动态库搜索路径;

    4.默认的动态库搜索路径/lib;

    5.默认的动态库搜索路径/usr/lib

有了这个再不会就是天才了。。。
分享到:
评论

相关推荐

    Linux编译内核详解

    2. **更新工具链**:使用最新的GCC版本可以避免一些编译错误。 3. **权限设置**:编译内核通常需要root权限。如果当前不是root用户,可以通过`sudo`命令提升权限。 #### 五、解压并配置内核源码 1. **下载并解压...

    Linux内核编译全过程详解(kernel2.6.7)[参考].pdf

    Linux 内核编译全过程详解(kernel 2.6.7) Linux 内核编译是一个复杂的过程,它需要仔细的规划和执行。在这个过程中,需要了解内核编译的各个阶段,包括编译前准备、编译配置、编译过程和运行内核的常见问题。下面...

    Linux编译安装软件时编译参数详解

    ### Linux编译安装软件时编译参数详解 在Linux环境下编译安装软件是常见的操作之一,尤其是对于开源软件而言,这种方式能够提供最大程度的定制化能力。本文将详细解析在Linux环境中编译安装软件时常用的编译参数,...

    Linux 程序编译过程详解.docx

    主要包括以下过程:删除所有的#define宏定义,展开所有的宏定义,处理所有的条件预编译指令,处理#include预编译指令,删除所有注释,添加行号和文件标识,以便编译时产生调试用的行号及编译错误警告行号。...

    Linux内核编译全过程详解

    ### Linux内核编译全过程详解 #### 一、前言 在深入了解Linux内核编译的过程中,我们将聚焦于kernel 2.6.7版本,并详细阐述整个编译流程中的关键步骤与注意事项。对于想要深入了解Linux内核工作原理及定制化需求的...

    linux编程调试详解

    Linux编程调试详解 在进行Linux编程的过程中,遇到bug和程序错误是不可避免的。为了有效地定位和修复这些问题,程序员需要掌握调试的技能。调试是软件开发中的一项重要技能,它有助于开发者理解程序的实际行为,并...

    linux内核移植配置编译详解

    在编译过程中,可能会遇到各种问题,例如依赖库缺失、编译错误、硬件驱动不兼容等。解决这些问题需要对Linux内核结构有深入理解,同时也需要一定的调试技巧。一旦内核编译完成,就需要将其烧录到目标硬件的存储介质...

    Linux编程技术详解 随书CD

    《Linux编程技术详解》随书CD的内容包含了丰富的Linux编程知识,旨在帮助读者深入理解Linux操作系统下的编程技巧和实践。这个ISO文件很可能包含了完整的书籍电子版、源代码示例、相关工具以及可能的教学视频等资源,...

    linux C函数详解

    《Linux C函数详解》这本书是Linux/unix环境下C/C++开发者的重要参考资料,它详细解析了在这些操作系统中广泛使用的C语言函数。对于那些希望深入理解系统级编程或提高C编程技能的人来说,这本书提供了宝贵的洞见。 ...

    loadrunner 监测linux系统图文详解

    《LoadRunner监测Linux系统图文详解》 在IT性能测试领域,LoadRunner是一款广泛使用的性能测试工具,能够模拟大量用户并发执行任务,以检测系统在高负载下的表现。本篇文章将详细解析如何使用LoadRunner监测Linux...

    linux 网卡驱动详解中文版

    ### Linux网卡驱动详解——Realtek 8139实例 #### 一、引言 在深入探讨Linux网卡驱动的开发之前,我们先来简要回顾一下驱动程序的重要性及其在操作系统中的作用。驱动程序是一种特殊的软件,它作为硬件与操作系统...

    Linux C函数详解 pdf格式

    8. **编译与调试**:Linux下常用的编译器是GCC,书里可能会教读者如何使用`gcc`命令行编译程序,以及使用`gdb`进行调试。 9. **实践项目**:好的教程通常包含实践项目,帮助读者将理论知识应用于实际。可能是创建...

    Linux编程技术详解(英文)源码资料.rar

    7. **内核模块开发**:学习如何编写、编译和加载内核模块,以扩展Linux内核的功能。 8. **调试技巧**:介绍gdb等调试工具的使用,以及如何通过strace和syslog等工具监控系统行为。 9. **性能优化**:探讨如何通过...

    linux 驱动开发详解

    《Linux驱动开发详解》是宋宝华先生撰写的一本深入探讨Linux驱动程序开发的专业书籍,主要针对第四版进行了详尽的阐述。这本书以其丰富的实践经验和深入的理论解析,为读者揭示了Linux内核驱动开发的奥秘。在提供的...

    《Linux编程技术详解》随书光盘源程序

    7. **Makefile的使用**:在Linux开发中,Makefile是组织和编译源代码的重要工具。学习如何编写和使用Makefile可以提高开发效率。 8. **错误处理和调试**:良好的错误处理是保证程序健壮性的重要环节。学会使用`...

    Linux应用程序开发详解

    《Linux应用程序开发详解》这本书是为初学者量身打造的一份全面而详尽的Linux开发指南。它旨在帮助读者从零开始,逐步掌握在Linux环境下进行应用程序开发的各种技术和工具。书中的内容涵盖了从基础的Linux操作系统...

    Linux编程技术详解

    "Linux编程技术详解"主要涵盖以下几个关键知识点: 1. **Shell编程**:Shell是Linux系统中的命令解释器,用于用户与操作系统内核交互。通过编写Shell脚本,我们可以自动化执行一系列命令,实现复杂的任务。了解Bash...

    Linux编译C/C++

    #### 二、链接错误详解 在使用GCC进行编译时,经常会遇到“undefined reference to 'xxxxx'”这类链接错误。这类错误通常表明程序引用了未被正确链接的外部库中的函数或数据。 1. **错误原因分析:** - 出现这类...

    Linux操作系统内核编译详解

    Linux操作系统内核编译详解是深入理解Linux系统工作原理和技术实践的重要步骤。内核作为操作系统的核心,负责管理系统的各种资源,如进程、内存、设备驱动、文件系统和网络,直接影响到系统的性能和稳定性。Linux...

    嵌入式Linux应用程序开发详解

    《嵌入式Linux应用程序开发详解》是一本专为想要深入理解和实践Linux应用程序开发的读者精心编写的指南。这本书结合了理论与实践,旨在帮助读者掌握在嵌入式系统环境中进行Linux应用开发的关键技能。通过阅读本书,...

Global site tag (gtag.js) - Google Analytics