参考: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. thinkphp框架做项目的前期配置

    ThinkPHP 目录结构说明 ThinkPHP.php:框架的公共入口文件 App:项目放置目录 Common:包含框架的一些公共文件.系统定义.系统函数和惯例配置等 Lang:系统语言文件目录 L ...

  2. PAT (Advanced Level) 1086. Tree Traversals Again (25)

    入栈顺序为先序遍历,出栈顺序为中序遍历. #include<cstdio> #include<cstring> #include<cmath> #include&l ...

  3. Codeforces 12 D Ball

    Discription N ladies attend the ball in the King's palace. Every lady can be described with three va ...

  4. NIO与传统IO的区别(形象比喻)[转]

    传统的socket IO中,需要为每个连接创建一个线程,当并发的连接数量非常巨大时,线程所占用的栈内存和CPU线程切换的开销将非常巨大.使用NIO,不再需要为每个线程创建单独的线程,可以用一个含有限数 ...

  5. NSTimer与NSRunLoop的关系分析

    NSTimer与NSRunLoop的关系分析 发表于 2013 年 6 月 27 日 由 bluev | 6 次浏览 最近关于NSTimer和NSRunLoop的关系,做了一个小试验.代码地址:htt ...

  6. 第24章、OnLongClickListener长按事件(从零开始学Android)

    在Android App应用中,OnLongClick事件表示长按2秒以上触发的事件,本章我们通过长按图像设置为墙纸来理解其具体用法. 知识点:OnLongClickListener OnLongCl ...

  7. 【effective c++】定制new和delete

    条款49: 了解new-handler的行为 operator new 和 operator delete只适合用来分配单一对象.array所用的内存由operator new[]分配出来,并由ope ...

  8. Android中查看服务是否开启的工具类

    这个也是昨天学习的,做下总结. 检查服务是否开启要写成一个工具类,方便使用,传服务的名字返回Boolean值,当然,由于须要,还要传一个上下文context. 说一下这个工具类的几个关键点: 1.方法 ...

  9. Bootstrap全局CSS样式之button和图片

    .btn-default--button的默认样式. .btn-primary--button的首选样式: .btn-success--button的成功样式: .btn-info--button的一 ...

  10. Android studio 导入githubproject

    Blog From:http://blog.csdn.net/onlysnail/article/details/45115093 从github下载两个开源项目: PagerSlidingTabSt ...