问题标签 [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.
gcc - 静态库中目标文件的顺序
我知道当链接到多个静态库或目标文件时,顺序很重要(依赖库应该在它们的依赖项之前列出)。我想知道,在使用 创建库文件时ar
,是否适用相同的规则并且库中的顺序很重要,或者在同一个.a
文件中它没有区别。
我正在用复杂的依赖图打包 200 多个目标文件,然后做
然后以正确的顺序列出它们要容易得多。
我正在使用gcc
,如果它有所作为。
c++ - 奇怪的ar链接错误
- 从头开始制作项目(作品)
- 尝试在不更改任何文件的情况下重新制作(不起作用)
- 删除静态库
- 再次制作而不更改任何文件(作品)
- 再次制作而不更改任何文件(不起作用)
步骤 1 的形式为:
这是步骤 2、3 和 4 的输出
linux - 如何提取包含重复目标文件的静态库?
我正在尝试构建一个合并两个静态库的大型静态库。此刻我正在使用“ar”命令,例如从“aa”和“ba”中提取对象,然后再次使用“ar”重新组装这些对象:
不幸的是,它不适用于我的目的,因为 aa 在内部具有相同名称的不同对象。'ar' 命令提取重复的对象并用相同的名称替换已经提取的对象。即使名称相同,这些对象也有不同的符号,因此我得到未定义的引用,因为某些符号与被替换的文件一起丢失。
我无法访问原始对象,并且已经尝试过“ar xP”和“ar xv”以及很多“ar stuff”。有谁可以帮助我展示如何合并这些库?
提前致谢。
linux - 在共享对象中包含静态库?
我想将一堆静态库编译成一个共享对象。到目前为止我有
上面的 objs/*.o 包含使用 ar 从各种静态库中提取的所有目标文件。
更新:基本上,我想知道我是否可以直接在命令行上使用 .a 文件而无需提取它们。
g++ - g++ 组合库
所以,我正在尝试将 libpthread.a 库合并到我自己的库中。但是当我尝试编译使用它的代码时,它给了我链接器问题。我通过执行以下操作来编译它:
但我最终得到了一堆undefined reference to 'pthread_stuff'
我真的不明白我做错了什么。
gcc - 你可以在另一个带有 ar 的静态库中包含一个静态库(.a)吗?
假设我在一个目录中有几个 .o 文件,这些文件被编入了一个静态库:
在另一个目录中,除了上面创建的 libstuff.a 之外,还有几个其他 .o 文件需要添加:
我认为包含 libstuff.a 可以在那里工作,但是当我这样做时我得到未定义的符号(应该在 libstuff.a 中定义),然后尝试与 libother.a 链接。(使用 g++)
有没有办法将 .a 组合成这样的静态库,或者这不可能?
c++ - 链接一个自注册的抽象工厂
我一直在使用和测试一个基于此处描述的自注册抽象工厂:
https://stackoverflow.com/a/582456
在我所有的测试用例中,它就像一个魅力,并提供了我想要的功能和重用。
使用 cmake 在我的项目中链接这个工厂非常棘手(尽管它似乎更像是一个 ar 问题)。
我有与链接的示例相同的 base.hpp、derivedb.hpp/cpp 和等效的 deriveda.hpp/cpp。主要是,我只是实例化工厂并调用 createInstance() 两次,每次使用“DerivedA”和“DerivedB”。
该行创建的可执行文件:
按预期工作。将我的派生类移动到库中(使用 cmake,但我也单独使用 ar 进行了测试)然后链接失败:
只调用第一个静态实例化(来自derivedA.cpp),从不调用第二个静态实例化,即
请注意,在 ar 行中交换两者仅调用derivedb.cpp 静态实例化,而不调用deriveda.cpp 实例化。
我是否遗漏了 ar 或静态库的某些内容,而这些库在 C++ 中不能很好地处理静态变量?
c - 对我自己的库的未定义引用
我已经创建了我的 lib.a 文件,其中有几个
然后
确认
但是当我尝试编译测试应用程序时
我在函数中有未定义的引用main
:从 file1.o、file2.o、file3.o 使用函数
android - 是否可以混合使用不同版本的 gcc 和 ld?
我的环境是 arm-linux-androideabi(东芝 AC100 上的 Android 2.2)。我的环境有 2 套 GCC 编译器(安装在设备上的不同位置):
- 4.4.3(Android 上的 Android NDK)
- 4.6.0(Android 上的 R + GCC)
我面临的问题是 gcc-4.6.0 运行时会出现段错误(但是它成功运行每个任务,只是在最后出现段错误,可能在退出例程中),而 ld-4.4.3 和 ar-4.4.3 失败在我的环境中运行。另一方面,gcc-4.4.3 运行良好,ld-4.6.0 和 ar-4.6.0 也是如此。
因此,在我的设备上构建时,如果我使用 4.4.3 运行配置,它将在配置步骤失败,因为即使配置测试程序编译成功,gcc 也会出现段错误并返回非零值 (139)。但是,如果我使用 4.6.0 运行 configure,configure 运行得很好,但是 build ( make all
) 在链接和静态库创建时惨遭失败。
我的问题是:
- 是否可以使用 gcc-4.4.3 编译我的目标文件(
gcc-4.4.3 -c input.c
),然后与 ld-4.6.0(ld-4.6.0 -o input input.o -lc
)链接?也就是说,我将删除有问题的二进制文件并使用工作二进制文件的组合来构建项目。 - 如果有警告,那么它们是什么?
linker - 在 unix 上创建库时,除了“ar rcs”之外还有什么必要的吗?
我有许多源文件要合并到一个.a
文件中。我用命令制作图书馆
然后我尝试使用我用来制作.o
文件的相同编译器(g++)链接到这个库:
但是,当我尝试使用在 thing1.cpp 中定义的函数(理论上在 thing.o 中表示)时,这会产生错误:
我还需要对.a
文件做些什么才能链接到它吗?