- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
.a
.o
和.lo
文件在C语言中有什么区别?
最佳答案
注意:
虽然我喜欢上面的答案,但它们不包括 .a/archive 库表单。因此,在这里我将通过添加 .so 库格式来解决所有这三个问题。此外,在 stackexchange 的脉络中,我将使用更多文本以防链接损坏(请注意,我不需要此链接的引用链接)。
当编译一个 .o 文件是一个包含编译器为目标平台发出的目标代码的目标文件。创建 .o 文件:
gcc -c filename.c <==== creates filename.o
请注意,此示例未创建位置无关代码 (PIC)。我们认为这是一个可能包含在静态库或可执行文件中的对象。也就是说,当我们将可执行文件与 .o 文件链接时,.o 文件中的代码会插入到可执行文件中——它是在构建时绑定(bind)的,而不是在运行时绑定(bind)的。这意味着可执行文件可以在不包含 .o 文件的情况下重新分发。警告:按照惯例,.o 文件被视为非 PIC。我们通常使用 .lo 扩展名来命名 PIC 对象文件。
.a 文件类型是一个“archive”库。它包含一个或多个 .o 文件,通常用于创建静态可执行文件。
我们使用 ar 命令来操作存档库。下面的示例 (1) 从 .o 文件创建存档库,然后 (2) 列出其中的内容。
创建库
$ ls *.o
a.o b.o c.o <=== the files going in the archive
$ ar q libmyStuff.a *.o <=== put *.o files in an archive (or new one)
ar: creating libmyStuff.a
$ ls *.a <=== just show the library created
libmyStuff.a
显示文件库的内容
$ ar t libmyStuff.a
a.o
b.o
c.o
.lo 的使用是一种通常用于与位置无关的目标文件的约定。在当前目录中,libtool compile 命令会同时创建一个 .lo 文件和一个 .o 文件,一个带有 PIC 代码,一个没有 PIC 代码.请参阅下面的输出:
$ libtool compile gcc -c a.c
libtool: compile: gcc -c a.c -fPIC -DPIC -o .libs/a.o <== PIC code
libtool: compile: gcc -c a.c -o a.o >/dev/null 2>&1 <== Not-PIC code
$ ls a.lo a.o
a.lo a.o <=== a.lo contains the PIC code.
另请注意,.libs 子目录是用 a.o 创建的。这个文件是 PIC 代码,尽管有名字。 Libtool 将此文件移动到当前目录并将扩展名更改为 .lo。
您可以随时手动创建 .lo 文件,只需在编译时使用 gcc 的 PIC 选项即可。将生成的 .o 文件移动到 .lo 扩展名。
按照惯例,.so 意味着一个“共享对象”库文件。我们将 PIC 对象文件放入共享库中。在与 .o 和 .a 文件的契约(Contract)中,当我们与 .so 文件链接时,代码不会包含在生成的编译文件中。那就是我们使用运行时绑定(bind)(如 .lo 的情况)。运行时绑定(bind)的形式不止一种,但我们不会在这里讨论。
关于c++ - .a .o 和 .lo 文件之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5895649/
这个问题在这里已经有了答案: Calculating mid in binary search (13 个回答) 关闭8年前。 我正在阅读二进制搜索...我知道查找中间值的传统方法就像 mid=(hi
我有一个大的 numpy 数组 k,形状未指定,我想构造一个相同形状的数组 d 当 中的相应条目时为 1.0 k 介于两个常量 lo 和 hi 之间,否则为 0.0。 (由于更大的代码在做什么,我不想
我正在尝试找出 Unicode 类别的基数,如 Lo。看来我找不到关于那个的权威信息。例如。 Fileformat.info维护此类别中有 11788 个字符的 View ,Codepoints.ne
假设我有一个像这样的对象数组 var outer = [ { "name": "T1", "inner": [ { "type": "DAY"
下面的代码是流行线段树代码的略微修改版本。 我的问题是为什么我们需要在递归构建树时进行 lo > hi 检查,我想不出一个 lo 永远大于 hi 的例子,因为在任何时候它们都等于 [2,2]递归不会更
算法如下: sort(A) quicksort(A, 0, n-1) end quicksort(A, lo, hi) if lo < hi then pi = partition(A
我现在在 Lo-Dash 文档站点上花了几个小时,但找不到解决我的问题的方法。不知道怎么叫,所以有点难找。我基本上想将一个数组分组到一个对象中,以便重复的条目是一个字段,而不同的条目是一个数组。 例如
看一眼 Lo-Dash 文档就会发现 API 属于以下类别: 数组, 链接, 收藏, 函数, 对象, 实用程序, 方法, 和属性 对 Arrays API 的更详细了解显示了大约 30 种适用于数组的
我知道 .so 文件是类似于 Windows 中的 .dll 文件的共享库文件,但是 .lo 文件呢? 最佳答案 .o object (contains compiled code)
如何使用 Lo Dash 使用大于和小于来过滤数组? 使用 Lo Dash 的 _.find demo data : var users = [ { 'user': 'barney', 'ag
我有一个来自推送项目的数组,当我使用 Lo-Dash 显示时,它按升序显示。 这是我的代码: Sorted Array // Sample array. var array = []; // Uti
是否有现有的方法可以在 ORMLite 中为我的 id 生成实现 HI/LO 算法? 我决定从 NHibernate 切换到 ORMLite,并且宁愿不使用 AutoIncrement 或 GUID。
我是 Java 编程新手,正在学习大学类(class),其中的作业是创建一个高/低猜谜游戏。游戏为用户提供最多 5 次尝试输入 1 到 100(含)之间的数字的机会。程序必须提供答案是否太低、太高或正
我有一个高低 ID 生成器,我在多线程环境中使用它。每个线程每秒最多可以调用生成器 100k 次 我有一个相当好的(而且安全的)实现,效果很好。 IdAllocator 是获取下一个“批处理”id 的
#define _CRT_SECURE_NO_WARNINGS #include #include #include #include #include #include #define
我有一个经过简化的数据集: var data = [{ size: 400 }, { size: 500 }, { size: 800 }, { size: 400 }
我有两个对象 A 和 B。我想知道它们是否共享 key x 和 y。 我是这样写的: function sharesKeys(keys, objA, objB) { return _.ever
我在使用 Lo-Dash 合并两个对象时遇到问题并且不明白为什么下面的代码不起作用。我希望 _merge 调用用 fnaaa 扩展 bbb,但这并没有发生。 my={}; my.aaa=functio
如果我有类似的东西 var obj = [{keywords: "a, b, c"}, {keywords: "d, e, f"}] 然后做 var result = _.pluck(obj, 'ke
我有下面的内联汇编代码。我在存在 %hi、%lo 的每一行收到编译错误“错误:无效的‘asm’:%-字母后缺少操作数”。 void func() { __asm__ ( "lis %%r4,
我是一名优秀的程序员,十分优秀!