问题标签 [unix-ar]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
7712 浏览

c++ - 具有同名目标文件的静态库 (ar)

一点上下文。假设我有源文件,需要在静态库中结束。假设有两个 cpp 文件a.cppa.cpp位于两个不同的子目录中。像这样的东西:

它们的内容没有冲突,完全不同。文件名是一样的。

现在,在编译时,我a.o当然会得到两个文件。

如果我现在创建一个静态库

我可以看到静态库中的两个文件都在运行nm libfoobar.a。看起来不错。

问题

我可以看到的问题是,如果我ar单独运行命令foo/a.o并将bar/a.o它们放在同一个静态库中。现在后一个对象文件将覆盖前者,所以在运行时nm libfoobar.a我只在库中看到后一个对象。我猜这是由于相同的目标文件名造成的。

使用 创建静态库时ar,我应该始终将所有对象一次合并,还是一次运行ar多次收集部分对象也可以,最终都在同一个静态库中?对于这个例子,我可以看到前者的作品,但不是后者。

当一个a.cpp改变并且静态库需要改变时,事情将如何工作?会在图书馆ar找改权吗?a.cpp

这只是一个小例子,但考虑一个包含许多文件并且一些具有相同名称的大型项目。如果您现在想创建一个库,您也可能会遇到这种情况。

一般来说,这只是库的组成方式、文件命名方式的糟糕组织,还是有其他东西可以让事情正常工作?

0 投票
1 回答
2684 浏览

ant - 使用 Apache Ant 且不使用 dpkg 创建 .deb

我正在尝试创建一个用于创建 .deb 安装文件的构建文件。

到目前为止,一切顺利。我的目标是避免使用 dpkg,以便可以从任何平台完成构建。

现在我创建了所有工件(control.tar.gz、data.tar.gz、debian-binary),我需要一个 Ant 任务来将这些文件打包到一个 deb 文件中。

deb 文件只是一个 Ar(l)-存档,但我不知道如何使用 Ant 创建这样的存档。

我刚刚找到了一些“ArFileSet”,所以我认为有可能,但我不知道如何以及在哪里使用这个 arFileSet。

0 投票
1 回答
2195 浏览

gcc - 将多个静态库合并到一个 GCC scons

我正在构建这个库 libmyproject.a 我希望它包含其他几个静态库(libone.a 和 libtwo.a),以便与 libmyproject 链接的应用程序也不必与 libone 和 libtwo 链接。

我是 GCC 链的新手。使用 Visual C++,我只需添加所有依赖项,它会创建一个库,其中还包含我想要的所有其他库。

我怎样才能用 GCC 做到这一点?

一个额外的问题:我正在使用 scons 来构建,有没有办法告诉 scons 这样做?现在它只是忽略了我提供的所有其他库,只将 .cpp 文件编译到库中。

0 投票
4 回答
3087 浏览

c - `ar` 库覆盖时间戳

.a 存档格式标头需要时间戳。这在我重建静态库时导致了无数的头痛,主要是因为我无法准确地重现原始二进制文件。

例如(这是在我的 Mac 上,但同样的事情发生在 x64 linux 上):

为了向自己证明唯一的区别是时间,我使用了基于 hexdump 的差异:

如果您使用标题格式进行反解,则它对应于时间字段。

手册页没有说明是否可以覆盖标头中的时间戳。有什么想法吗?

编辑:是的,可以返回并物理破解文件以使用任意时间戳。是的,可以改变程序的行为。考虑到这种情况的情况,并非所有这些都是严格的技术性质,手动更改时间戳的工具是不可接受的,修改版本也不可接受,也ar不会弄乱实际系统时间。

编辑:在这种情况下,我必须证明,在构建路径没有任何不可接受的偏差的情况下,可以从源代码生成二进制文件。在某些行业(例如金融),这显然是一种标准做法。更改时间戳的手动工具是不可接受的(因为使用了不在原始构建路径中的特殊工具)。的手卷版本ar是不可接受的(类似问题)。更改系统时钟的问题在于构建必须完美协调(这是一个长达一小时的构建,包含大量库和二进制文件)。可接受的解决方案包括:

  • 标记到 AR 或其他可能覆盖库中时间戳的程序
  • 现有的(年龄 > 1 岁)工具来执行此操作
  • 在进行链接时可能会覆盖来自 ar 的时间戳的 GCC 标志
0 投票
2 回答
6524 浏览

linker - 链接比创建静态库更快时使用 --start-group 和 --end-group 吗?

如果一个人在自己的构建脚本中构建静态库并且想要使用这些静态库来链接最终的可执行文件,那么提到.a文件的顺序很重要:

如果gui.a使用hw.a链接中定义的某些内容将失败,因为在hw.a处理时,链接器还不知道稍后需要该定义,并且不会将其包含在being.generated 可执行文件中。手动摆弄链接器行是不切实际的,因此使用一种解决方案--start-group--end-group它使链接器在库中运行两次,直到不再找到未定义的符号。

但是 GNU ld 手册说

使用此选项会带来很大的性能成本。最好仅在两个或多个档案之间存在不可避免的循环引用时才使用它。

所以我认为最好将所有.a文件放在一个.a文件中,并带有一个索引(-sGNU ar 的选项),该索引说明文件需要以什么顺序链接。然后一个人只将那个.a文件提供给g++.

但我想知道这是否比使用组命令更快或更慢。这种方法有什么问题吗?我也想知道,有没有更好的方法来解决这些相互依赖的问题?


编辑:我编写了一个程序,它采用.a文件列表并生成合并.a文件。使用 GNU 通用ar格式。将 LLVM 的所有静态库打包在一起就像这样

我将速度与.a手动解压缩所有文件然后使用重新计算索引将它们放入新.a文件进行了比较。ar使用我的arcat工具,我获得了大约 500 毫秒的一致运行时间。使用手动方式,时间变化很大,大约需要2s左右。所以我认为这是值得的。

代码在这里。我把它放到公共领域:)

0 投票
1 回答
262 浏览

android - ar 命令行长度

我有一个非常长的命令行,由 bjam 提供给ar(确切地说是 android ar),而 ar 只是破坏了文件路径并抱怨文件不存在。

有没有办法让 ar 分配更大的命令行缓冲区?

0 投票
2 回答
247 浏览

gcc - Macos 10.6.8 (Snow Leopard) 上的本机工具链问题

下面是问题的描述。我将其全部标记为代码以避免 StackOverflow 所做的隐式格式化。当我确切地知道自己想如何格式化我的问题时,不得不处理类似 Wiki 的标记语言是非常烦人的。

0 投票
1 回答
501 浏览

c++ - 使用存档 (.a) 编译程序时遇到问题

当我尝试使用库(.a) 编译我的文件时,我收到“致命错误:URLInputStream.h:没有此类文件或目录编译终止。' . 我对 C++ 还是很陌生,这看起来很简单,但我无法让它工作。

我试过的编译命令:

我如何编译我的档案:

存档似乎正确构建:

我还尝试了各种选项ar。如果我指定包含路径-I utils/inc,那么它将编译并正常工作,因此我想要的文件可以正常工作。我在 StackOverflow 上阅读了许多文章和问题,但我似乎看不出我做错了什么。 有什么想法或建议吗?

注意:我正在编译一个看起来很奇怪的标题。它最初被拆分为.cppand .h,但为了简化问题解决,我将它们合并。拆分时也发生了同样的错误:g++ src/Downloader.cpp -I inc -L lib -l cs240utils

0 投票
1 回答
1861 浏览

linker - ar 引入了未定义的引用

我试图弄清楚如何使用静态库,但最简单的例子失败了:

编译foo.cmain.c工作:

归档foo.o也不抱怨:

但链接失败,未定义引用func

都给我:

如果我通过gcc链接绕道而行,我会收到类似的错误:

给我吗:

我在这里做错了什么?根据我阅读/使用的所有手册和搜索引擎,这是使用静态库的方式。


编辑:头脑gcc foo.o main.o工作得很好。

0 投票
1 回答
2842 浏览

c++ - Mac Lion 无法使用“ar”、“无符号”创建库

我在 IO.h 和 IO.cpp 中有 C++ 源代码,并且想要制作一个静态库 libvcf.a 。然后我使用以下命令:

没问题。

但,

我现在使用 Mac OSX Lion,g++ 版本如下:

看起来我可以在 Linux 上使用相同的命令,但不能在 Mac 上使用。我也用谷歌搜索并没有运气。这里有什么建议吗?谢谢。