关于include,load的几个问题
参考: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的几个问题的更多相关文章
- Difference Between Performance Testing, Load Testing and Stress Testing
http://www.softwaretestinghelp.com/what-is-performance-testing-load-testing-stress-testing/ Differen ...
- [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 ...
- 操作系统开发系列—12.e.Makefile
先来看一个简单的Makefile,我们把它放在目录/boot下,可以用来编译boot.bin和loader.bin. # Makefile for boot # Programs, flags, et ...
- php类自动装载、链式操作、魔术方法
1.自动装载实例 目录下有3个文件:index.php load.php tests文件夹 tests文件夹里有 test1.php <?php namespace Tests; class T ...
- mvc-3模型和数据(1)
MVC和命名空间 var User = function(atts) { this.attribute = atts || {}; } //和具体user相关的方法 User.prototype.de ...
- NRF51822之pstorage介绍
This information applies to the following SoftDevices: S110, S120, S130, S310 Introduction Persisten ...
- 虚拟化之esxi命令行管理
Vmware PowerCLI和Vmware CLI vMA A Linux virtual appliance that includes the vSphere SDK for Perl and ...
- Centos 7 Puppet之foreman介绍安装测试
一.简介 1.前言(引用一下网上的资料) 随着企业的 Linux 系统数量越来越多,管理问题便成为一个相对麻烦并需要急 迫解决的问题,这里有 2 个 Key Message:1)统一管控体系非常重要, ...
- 自制操作系统Antz(8)——实现内核 (中) 扩展内核
Antz系统更新地址: https://www.cnblogs.com/LexMoon/category/1262287.html 在前几天的任务中,我们已经简单实现了MBR,直接操作显示器和硬盘操作 ...
- debian系统下apache2开启ssi功能
SSI (Server Side Include)的 html 文件扩展名 (.shtml), 通常称为"服务器端嵌入"或者叫"服务器端包含"说白了就是类似其他 ...
随机推荐
- 标准C程序设计七---24
Linux应用 编程深入 语言编程 标准C程序设计七---经典C11程序设计 以下内容为阅读: <标准C程序设计>(第7版) 作者 ...
- [bzoj1345][Baltic2007]序列问题_单调栈
bzoj-1345 Baltic-2007 序列问题 题目大意:对于一个给定的序列a1,…,an,我们对它进行一个操作reduce(i),该操作将数列中的元素ai和ai+1用一个元素max(ai,ai ...
- Jetson TK1 四:重新安装系统(刷机)
转载:http://blog.sina.com.cn/s/blog_bab3fa030102vk21.html Jetson TK1是NVIDIA基于Tegra K1开发的一块低成本开发板,板载一块T ...
- uicollectionview 使用uibutton或者uiimageview实现旋转出现scale的问题
uicollectionview下单独使用uibutton然后setimage或者直接使用uiimageview然后一定角度旋转后发现size会变动 解决方案:添加uibutton到uicollect ...
- mac mysql重置密码
http://blog.csdn.net/xiaozhuanddapang/article/details/53185775 情况一:在mysql官网直接下载dmg文件进行安装,忘记密码 1.关闭my ...
- iOS开发 当前时间 时间戳 转换
1.今天在做一个webservice的接口的时候,被要求传一个时间戳过去,然后就是开始在Google上找 2.遇到两个问题,一,当前时间转化为时间戳,二,获取的当前时间和系统的时间相差8个小时 一,转 ...
- 转: memcached Java客户端spymemcached的一致性Hash算法
转自:http://colobu.com/2015/04/13/consistent-hash-algorithm-in-java-memcached-client/ memcached Java客户 ...
- ArcGIS 10.3 for Server新特性介绍
ArcGIS10.3的正式版立即在美国Esri全球用户大会推出.中国的正式发行时间预计在Esri中国的用户大会.以下就将用户比較关心的ArcGIS 10.3 for Server的新特性给大家进行简单 ...
- 翻译:A Tutorial on the Device Tree (Zynq) -- Part IV
获取资源信息 内核模块驱动加载之后,就开始把硬件资源管理起来,如读写寄存器.接收中断. 来看看设备树里的一条: xillybus_0: xillybus@50000000 { compatible = ...
- hiho1079 线段树区间改动离散化
题目链接: hihocoder1079 代码: #include<iostream> #include<cstdio> #include<cstring> #inc ...