- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
include 和 link 的真正作用是什么?有什么区别?为什么我需要同时指定它们?当我编写 #include math.h
然后编写 -lm
来编译它时,#include math.h
和 - lm
分别做什么?
据我了解,在链接库时,您需要它的 .h 文件和它的 .o 文件。这是否表明 #include math.h
意味着接收 .h 文件,而 -lm
接收 .o 文件?
最佳答案
您需要 header (接口(interface)描述)和库(实现)的原因是 C 比 C# 或 Java 等语言更清楚地将两者分开。可以编译一个 C 函数(例如通过调用 gcc -c <sourcefile>
),即使被调用的库不存在,它也会调用库代码;包含接口(interface)描述的 header 就足够了。 (这对于 C# 或 Java 是不可能的;程序集 resp。类文件/jar 必须存在。)在链接阶段,虽然库必须存在,即使它是动态的,afaik。
相比之下,对于 C#、Java 或脚本语言,实现包含定义接口(interface)所需的所有信息。编译器(与链接器没有明确分开)查看包含调用实现的 jar 文件或 C# 程序集,并从那里获取有关函数签名和类型的信息。
理论上,该信息也可能存在于用 C 编写的库中 — 它基本上是调试信息。但是经典的 C 编译器(与链接器相反)不会注意到库或目标文件,也无法解析它们。 (应该记住,您通常用于编译 C 程序的“编译器”可执行文件,例如 gcc,是一个“编译器驱动程序”,它解释命令行参数并调用实际执行操作的程序,例如预处理器,实际编译器和实际链接器,以创建所需的输出。)
因此理论上,如果您在已知位置有一个正确注释的库,您可能会编写一个编译器,在没有函数声明和类型定义的情况下针对它编译 C 函数;编译器必须生成正确的声明。编译器必须知道要解析哪个库(这对应于在 VS 中设置 C# 项目“引用”或在 Java 中具有类路径和名称/类对应关系)。
可能最简单的方法是使用像 stabs 或 dwarf 这样的众所周知的调试格式,并使用一个小的帮助程序从中提取接口(interface)定义,该程序使用调试格式的 API,提取信息并生成一个 C 头文件,它被添加到每个源文件中。那将是编译器驱动程序的工作,而实际的编译器仍然不会注意到这一点。
关于c - 链接到库时,include 和 link 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26562335/
平时很少在jquery中用到this。查看代码时发现用到了,就调试出this的值,心想原来如此。还是挺有用的。这里总结一下this与$(this)的区别和使用。 $(this)生成的是什么?
使用单例类和应用程序范围的托管 bean 来保存应用程序数据有区别吗? 我需要查找某些 JNDI 资源,例如远程 bean 接口(interface),因此我为自己编写了一个单例来缓存我的引用并且只允
如果您仔细查看包含的图片,您会注意到您可以使用 Eclipse IDE 重构 Groovy 代码并将方法转换为闭包,反之亦然。那么,闭包到底是什么,它与方法有什么不同呢?有人可以举一个使用闭包的好例子
vagrant box repackage有什么区别( docs ) 和 vagrant package ( docs )? 我意识到 vagrant package仅适用于 VirtualBox 提
我想看看是否有人可以解释为什么以下代码适用于 valueOf 但不适用于其他代码。 import java.math.BigDecimal; public class Change { publ
这个问题已经有答案了: 已关闭12 年前。 Possible Duplicates: What is Closures/Lambda in PHP or Javascript in layman te
This question already has answers here: Vagrant, Docker, Puppet, Chef (3个答案) 2年前关闭。 docker和chef有什么共同
以下代码在95%的机器上产生相同的输出,但是在几台机器上却有所不同。在 Debug模式下,输出: Changing from New to Fin OK 但在 Release模式下: Changing
////Creating Object var Obj; // init Object Obj= {}; 它们之间有什么区别两个? 有没有可能把它变成一个单行? 这样使用有什么好处吗?
我想找出定时器服务之间的区别。我应该使用哪个以及何时使用。我正在使用 Jboss 应用服务器。 1) java.ejb.Schedule。 @Schedule注解或配置自xml。 2) javax.e
我发现在 C++ 中可以通过三种不同的方式将对象传递给函数。假设我的类(class)是这样的: class Test { int i; public: Test(int x);
有什么区别。 public class Test { public static void main(String args[]) { String toBeCast = "c
如果我有一列,设置为主索引,设置为INT。 如果我不将其设置为自动递增,而只是将唯一的随机整数插入其中,与自动递增相比,这是否会减慢 future 的查询速度? 如果我在主索引和唯一索引为 INT 的
这两种日期格式有什么区别。第一个给出实际时间,第二个给出时间购买添加时区偏移值。 NSDateFormatter * dateFormatter = [[NSDateFormatter alloc]
如果有一个函数,请说foo: function foo() { console.log('bar'); } 那么在 JavaScript 中,从另一个函数调用一个函数有什么区别,如下所示: f
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 4 年前。 Improv
代码是什么: class Time { private: int hours; int minutes; int seconds; pu
我知道这是非常基本的,但有人介意解释一下这两个数组声明之间的区别吗: #include array myints; ...和: int myints[5]; ...以及为什么 myints.size
我学会了如何根据 http://reference.sitepoint.com/css/specificity 计算 css 特异性但是,基于this reference,我不明白伪类(来自c)和伪元
为什么在运行 2) 时会出现额外的空行?对我来说 1 就像 2。那么为什么 2) 中的额外行? 1) export p1=$(cd $(dirname $0) && pwd) #
我是一名优秀的程序员,十分优秀!