参考:http://www.network-theory.co.uk/docs/gccintro/gccintro_17.html

1. include的文件在哪找,找不到会如何?

  工具: gcc -H -fsyntax-only test.c

用“”引入的话,首先在当前目录查找,然后在系统目录查找;使用<>引入的话,直接在系统目录查找。

首先研究#include <stdio.h>  ,发现stdio.h在 /usr/include 下

    即,/usr/include 是一个默认路径。

还有个目录类似 /usr/include/x86_64-linux-gnu/sys/cdefs.h,如果要引入 cdefs.h 应该 #include<sys/cdefs.h>

    这也就是说, /usr/include/x86_64-linux-gnu/ 是默认的系统路径。

还有个目录类似 /usr/lib/gcc/x86_64-linux-gnu/4.8/include/stddef.h,如果要引入 stddef.h ,用 #include <stddef.h>

  这也就是说, /usr/lib/gcc/x86_64-linux-gnu/4.8/include/ 是一个默认路径。

在编译时,可以使用 -I参数指定include 路径,该路径会搜索“”包含的头文件。参考 http://mathlab.utsc.utoronto.ca/courses/cscd43w17/csc443clean/tutorials/leveldb.html

参考: http://www.network-theory.co.uk/docs/gccintro/gccintro_21.html

2. 假设include找到了,那么编译就可以完成。那么运行时,如何load include里面声明的函数?

当对libfuse-2.9.2进行make install后,几个相关的包如libfuse.so.2被拷贝到了/usr/local/lib目录下。此时,对ssfs进行make和make install均可以成功,但是在运行时却出现错误,提示:

./ssfs: error while loading shared libraries: libfuse.so.2: cannot open shared object file: No such file or directory

将libfuse.so.2拷贝到/usr/lib目录下可以解决这一问题。

按照https://unix.stackexchange.com/questions/22926/where-do-executables-look-for-shared-objects-at-runtime来看,/usr/local/lib也在默认的搜索路径,因为 /etc/ld.so.conf的内容是

include /etc/ld.so.conf.d/*.conf,而leveldb@river:/etc/ld.so.conf.d$ cat libc.conf 的内容是 /usr/local/lib。

因此,这个问题可能是 /etc/ld.so.conf的内容没有被系统正常识别。

根据https://unix.stackexchange.com/questions/67781/use-shared-libraries-in-usr-local-lib的第二个回答,确实是没有被识别,使用sudo ldconfig会自动将 /etc/ld.so.conf.d/*.conf的条目加入load缓存。将/usr/lib里的库改名,仍热可以正确运行 sudo ./ssfs /mnt -f 了。

 

3. 上述1中的系统include在linux系统的目录下可以找到。那么这些文件与 glibc源文件里的include内容有何区别呢?

答:glibc源文件是用来编译glibc库的。比如,glibc实现了一个函数f1(), 该函数的具体实现在glibc的源文件xx.c里。glibc的另一个源文件需要用到函数f1(),那么需要一个头文件来包含f1()的形式,这个头文件就在glibc的源文件里。 当这个些glibc的源文件被编译好为一个libc.so 的库后,其他程序需要使用里面的函数f1(),就需要知道该函数的形式,那么需要一个头文件来包含这个形式,这个头文件被放在系统的/usr/include/下面。

总结一下就是,glibc源文件里的头文件是给glibc源代码用的,而系统/usr/include/下的头文件是给用户程序用的。

4. 静态与动态链接

5. 环境变量

系统有很多环境变量,比如$PATH 决定了从shell输入的命令在哪些路径下寻找。

对于编译器来说,可以设置搜寻头文件路径的环境变量。对于连接器来说,也可以设置搜寻库路径的环境变量。

关于include,load的几个问题的更多相关文章

  1. Difference Between Performance Testing, Load Testing and Stress Testing

    http://www.softwaretestinghelp.com/what-is-performance-testing-load-testing-stress-testing/ Differen ...

  2. [Windows Azure] Load Testing in Windows Azure

    The primary goal of a load test is to simulate many users accessing a web application at the same ti ...

  3. 操作系统开发系列—12.e.Makefile

    先来看一个简单的Makefile,我们把它放在目录/boot下,可以用来编译boot.bin和loader.bin. # Makefile for boot # Programs, flags, et ...

  4. php类自动装载、链式操作、魔术方法

    1.自动装载实例 目录下有3个文件:index.php load.php tests文件夹 tests文件夹里有 test1.php <?php namespace Tests; class T ...

  5. mvc-3模型和数据(1)

    MVC和命名空间 var User = function(atts) { this.attribute = atts || {}; } //和具体user相关的方法 User.prototype.de ...

  6. NRF51822之pstorage介绍

    This information applies to the following SoftDevices: S110, S120, S130, S310 Introduction Persisten ...

  7. 虚拟化之esxi命令行管理

    Vmware PowerCLI和Vmware CLI vMA A Linux virtual appliance that includes the vSphere SDK for Perl and ...

  8. Centos 7 Puppet之foreman介绍安装测试

    一.简介 1.前言(引用一下网上的资料) 随着企业的 Linux 系统数量越来越多,管理问题便成为一个相对麻烦并需要急 迫解决的问题,这里有 2 个 Key Message:1)统一管控体系非常重要, ...

  9. 自制操作系统Antz(8)——实现内核 (中) 扩展内核

    Antz系统更新地址: https://www.cnblogs.com/LexMoon/category/1262287.html 在前几天的任务中,我们已经简单实现了MBR,直接操作显示器和硬盘操作 ...

  10. debian系统下apache2开启ssi功能

    SSI (Server Side Include)的 html 文件扩展名 (.shtml), 通常称为"服务器端嵌入"或者叫"服务器端包含"说白了就是类似其他 ...

随机推荐

  1. html的常见meta标签信息

    设置页面不缓存<meta http-equiv="pragma" content="no-cache"><meta http-equiv=&q ...

  2. compose.yml模板文件

    默认的模板文件名称为 docker-compose.yml,格式为 YAML 格式. 示例: version: " services: webapp: image: examples/web ...

  3. 使用nginx转发不了静态文件

    从django runserver的请求来看,都收不到静态文件请求, 查看firefox的web console请求,发现都是403 然后发现nginx不在当前用户组,并且当前用户的项目的读写权限是7 ...

  4. SolidEdge如何绘制变化半径倒圆角

    1 在要变化半径的边上打一些点   2 点击倒角命令的参数对话框,选择可变半径   3 选择倒角的直线,右击确认,再依次点击关键点,修改倒角数值,修改之后按回车,继续下一个点,直到结束.  

  5. 微信小程序 - 音频播放(1.2版本和1.2版本之后)

    不多说了,直接贴code // 1.2版本以后便不在维护 wx.getBackgroundAudioManager({ success:function(res){ var status =res.s ...

  6. 走入asp.net mvc不归路:[3]创建控制器

    实际上,控制器就是一个类,一个继承自Controller的类.正常创建一个Controller即可,而问题在于asp.net mvc提供了一套便捷的方法,在创建一个Controller时,可以自动创建 ...

  7. HTML5与Javascript 实现网页弹球游戏

    终于效果图: 1. 使用html 5 的canvas 技术和javascript实现弹球游戏 总体流程图: 1.1 html5 canvas技术的使用 首先在html页面中定义画布. <canv ...

  8. 把握linux内核设计思想(五):下半部机制之工作队列及几种机制的选择

    [版权声明:尊重原创.转载请保留出处:blog.csdn.net/shallnet,文章仅供学习交流,请勿用于商业用途]         工作队列是下半部的第二种将工作推后运行形式.和软中断.task ...

  9. 翻译:A Tutorial on the Device Tree (Zynq) -- Part V

    A Tutorial on the Device Tree (Zynq) -- Part V Application-specific data 之前提过,设备树中是一些特殊信息,这样一个驱动可以管理 ...

  10. Centos修改静态IP

    vim /etc/sysconfig/network-scripts/ifcfg-eth0代开配置文件 写入 DEVICE=eth0 #描述网卡对应的设备别名,例如ifcfg-eth0的文件中它为et ...