编译错误详解
头文件:
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
有了这个再不会就是天才了。。。
分享到:
相关推荐
给大家分享下,希望能顺便指出我的错误。请复制到记事本,然后取消自动换行。看起来就会很清晰了。 <br> <br>/ 根目录 <br> │ <br> ├boot/ 启动文件。Linux的内核及引导系统程序所需要的文件目录,...
3.4.2 GCC编译选项解析............................................................................................. 56 3.5 调试器GDB的使用技巧..............................................................
Linux 环境下 make 和 makefile 详解 ...但是,Makefile 文件需要按照特定的语法进行编写,否则可能会导致编译错误。 在 Linux 环境下,Makefile 文件是编译管理的重要工具之一,广泛应用于各种编译项目中。
Linux 下软件安装详解 Linux 下软件安装是一件复杂的事情,对初学者来说,难度远高于 Windows 下软件安装。要了解 Linux 下软件安装,首先需要了解 Linux 下软件的格式。 Linux 下软件格式有多种,包括 rpm、deb、...
在日常编码过程中会遇见各种编译错误,本文对常见的编译错误进行分析总结。(基本的编译错误在这里不列举,后续后持续更新)1、error c101008a解决方法该错误出现在项目升级过程中会出现,比如说项目从vs2008升级到...
我编译用到的包(protobuf-2.5.0.tar.gz,findbugs-3.0.1.tar.gz,apache-ant-1.9.13-bin.tar.gz,snappy-1.1.1.tar.gz)和编译的过程详解(遇到的错误)都在压缩包中(hadoop源码请到官网下载)。 背景Hadoop官网...
linux设备驱动程序中英文版加源码 目录 1. 第一章 设备驱动简介 1.1. 驱动程序的角色 1.2. 划分内核 1.2.1. 可加载模块 1.3. 设备和模块的分类 1.4. 安全问题 1.5. 版本编号 1.6. 版权条款 1.7. 加入内核开发社团 ...
最后make all的时候产生一个莫名其妙的错误说什么有warning且-Werror置为了true,死活没google到-Werror是什么鬼,只好作罢了。 今天本菜鸟突然想起来,朕还有Ubuntu虚拟机,权且一试,没想到轻松成功。 平台:...
在 Linux 环境下,安装 MySQL 有三种方式:二进制软件包安装、RPM 包安装和通过对源码进行编译安装。每种方式都有其优缺点,二进制软件包安装是官方推荐的安装方式,适合初学者学习使用,安装简单,可以安装到任何...
Squid 配置详解 Squid 是一个流行的开源代理服务器软件,广泛应用于企业网络中。在本文中,我们将详细介绍 Squid 的配置过程,包括安装、配置和编译等步骤。 安装 Squid 首先,我们可以从 Squid 官方网站 ...
1.7插曲:系统地避免各种指针错误. . . . . . . . . . . . . . . . .. . . . . . 14 1.8应用到Observer 上.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 1.9再论shared_ptr 的线程安全.. . . . . ...
如果在执行command命令时返回了一个非"0"的出错信号,例如makefile文件中出现了错误的目标文件名或者出现了以连字符打头的命令字符串,make操作一般会就此终止,但如果make后带有"-i"参数,则make将忽略此类出错...
1.如何在linux上下载SVN代码 2.有展讯编译流程的详解 3.展讯刷机流程详解 4.展讯下载到硬件里面的说明 5.本人自己实践编译的理解以及遇到的问题总结
一、rpm包安装方式步骤: 1、找到相应的软件包,比如soft.version.rpm,下载到本机某个目录;...-f 忽略任何错误 -U 升级安装 -v 检测套件是否正确安装 这些参数可以同时采用。更多的内容可以参考RPM的命令
Libusb 的编译安装请查看Readme,这里不做详解 二 libusb 的外部接口 2.1 初始化设备接口 这些接口也可以称为核心函数,它们主要用来初始化并寻找相关设备。 usb_init 函数定义: void usb_init(void); ...
第三章:Linux环境下的C编程(GCC编译过程和GCC编译指令,GDB调试器) 第四章:c程序维护工具 make (makefile文件命名规则,含有PDF文件,内嵌在word里面,可打开,伪目标,简化,makefile变量等内容) 第五章:ARM...
很多时候,使用一些特别的库, 在编译可执行程序时, 需要添加额外的 CFLAGS 和 LIBS . 否则会提示找不到指定的头文件或者”undefined reference to …” 的错误信息.假如程序 test.c 中使用了 libxml 的 api, 直接 ...
1. 安装 GCC:GCC 是 Linux 下的编译器,我们需要安装 GCC 来编译 Nginx。命令:`yum -y install gcc` 2. 安装 PCRE:PCRE 是一个 Perl 库,包括 Perl 兼容的正则表达式库,Nginx 的 HTTP 模块使用 PCRE 来解析正则...
对动态库的实际应用还不太熟悉的读者可能曾经遇到过类似“error while loading shared libraries”这样的错误,这是典型的因为需要的动态库不在动态链接器ld.so的搜索路径设置当中导致的。 具体说来,动态链接器...
由于时间仓促,可能依然存在一些错误和问题,请读者见谅,欢迎读者讨论和指点。 编辑本段 目 录 第1章 Android系统概述 1 1.1 基础知识 1 1.1.1 Android开发系统的由来 1 1.1.2 移动电话系统开发模式 2 ...