参考: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. HDU 3001 三进制 状压dp

    Travelling Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  2. Day 8 Linux之Day8

    Linux 之 Day 8 一.Linux网络原理及基础设置 1. 使用ifconfig命令来维护网络 1) ifconfig命令的功能:显示所有正在启动的网卡的详细信息或设定系统中网卡的IP地址. ...

  3. 初学Android,BroadcastReceiver之发送接收广播

    BroadcastReceiver用于监听系统全局广播消息,由于BroadcastReceiver是一种全局的监听器,因此它可以非常方便地实现系统中不同组件之间通信 启动它需要两步 1.创建需要启动的 ...

  4. Docker资源限制实现——cgroup

    摘要 随着Docker技术被越来越多的个人.企业所接受,其用途也越来越广泛.Docker资源管理包含对CPU.内存.IO等资源的限制,但大部分Docker使用者在使用资源管理接口时往往还比较模糊. 本 ...

  5. Halcon导出的cpp, VC++环境配置

    方式一: 1.project ->设置(Alt+F7) -> C/C++ ->分类:预处理器 ->附加包括路径   添加:$(HALCONROOT)/include,$(HAL ...

  6. Raspberry Pi学习笔记

    一.树莓派 Raspberry Pi 更换国内源 编辑 /etc/apt/sources.list 文件,用 nano 命令编辑 pi@raspberrypi:~$ sudo cp /etc/apt/ ...

  7. Linux下Tomcat VM參数改动

    不可行的方法 最初我直接改动catalina.sh, 将JAVA_OPTS变量加上了 -server -Xms1G -Xmx1G -XX:+UserG1GC 最初看起来没啥问题,可是当服务器运行几天后 ...

  8. weexapp 开发流程(三)其他页面创建

    1.首页 (1)轮播图 步骤一:创建 轮播图 组件(Slider.vue) src / assets / components / Slider.vue <!-- 轮播图 组件 --> & ...

  9. C++学习总结 复习篇2

      延续上一小节内容:下面继续讲解虚函数和多态 虚函数和多态 基类指针可以指向任何派生类的对象,但是不能调用派生类对象的成员. 但是,基类可以调用覆盖了虚函数的函数.(现在调用将来,这有问题,说明现在 ...

  10. 程序的载入和运行(五)——《x86汇编语言:从实模式到保护模式》读书笔记25

    程序的载入和运行(五)--<x86汇编语言:从实模式到保护模式>读书笔记25 前面几篇博文最终把代码分析完了.这篇就来说说代码的编译.运行和调试. 1.代码的编译及写入镜像文件 之前我们都 ...