gpt4 book ai didi

ios - 如何链接 iOS 的静态库

转载 作者:可可西里 更新时间:2023-11-01 04:16:35 24 4
gpt4 key购买 nike

我创建了一堆 .o文件(通过 gcc -c $file.c $someotherops -o $file.o )。现在我想将它们链接到一个静态库中。

我不确定我是否应该使用 ldgcc为了这。在 ld手册,据说我不应该直接使用它。但是,我无法弄清楚创建静态库的 gcc 参数。

我试过 ld *.o -static -o libfoo.a但它提示很多缺少符号(我认为都来自 libc)。我不明白为什么它会提示,因为它应该是一个静态库。我认为一旦我将该静态库链接到其他东西,它就会检查符号。

另一件事:我使用 /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/ld在这里(我的目标是 iOS)。它提示警告 ld: warning: using ld_classic .这是关于什么的?

然后我想,也许它需要指定动态库。所以我加了-lc链接到 libc。但它提示 can't locate file for: -lc .我加了 -L/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk/usr/lib并且有一个 libc.dylib .

有任何想法吗?

关于-lc错误:它在我指定后消失了 -arch armv6 .然后它提示一个错误libcache.dylib (必须从 libc.dylib 链接,我猜是因为它没有指定它)。添加 -L.../usr/lib/system有帮助。

现在,每单.o文件,我收到警告 ld: warning: CPU_SUBTYPE_ARM_ALL subtype is deprecated .这是关于什么的?

而且我仍然有一堆缺少的符号,尤其是:

Undefined symbols for architecture armv6:
"start", referenced from:
-u command line option
(maybe you meant: _PyThread_start_new_thread)
"___udivsi3", referenced from:
_get_len_of_range in bltinmodule.o
_quorem in dtoa.o
_array_resize in arraymodule.o
_newarrayobject in arraymodule.o
_array_fromfile in arraymodule.o
_get_len_of_range in rangeobject.o
_inplace_divrem1 in longobject.o
...
"___unorddf2", referenced from:
_builtin_round in bltinmodule.o
...

我检查了其中一些符号,例如 ___udivsi3get_len_of_range .该函数仅使用 C 算法,没有外部调用。所以这似乎被翻译成使用一些外部函数,如 ___udivsi3 .但这是在哪些库中?
-lgcc_s.1修复了大部分 ___udivsi3和相关的缺失符号。 start符号仍然缺失。什么 -u command line option意思是?

来自 here ,我感觉也许 ld毕竟不是正确的工具。在那里,只需调用 ar用来。这似乎更有意义。我会检查这是否有效,然后将其转换为答案。

边玩边多, ar在构建胖静态库时向我发出一些警告。它给了我使用 libtool 的提示反而。这就是我现在正在做的,即 libtool -static -o libfoo.a *.o .我也将编译器切换到 /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang但不确定这是否重要。

现在,在编译链接到此静态库的一些测试应用程序时,我收到以下警告:
ld: warning: PIE disabled. Absolute addressing (perhaps -mdynamic-no-pic) not allowed in code signed PIE, but used in __PyBuiltin_Init from /Users/az/Programmierung/python-embedded/libpython.a(bltinmodule.o). To fix this warning, don't compile with -mdynamic-no-pic or link with -Wl,-no_pie
ld: warning: 32-bit absolute address out of range (0x1001B70C4 max is 4GB): from _usedpools + 0x00000004 (0x001B70CC) to 0x1001B70C4
ld: warning: 32-bit absolute address out of range (0x1001B70C4 max is 4GB): from _usedpools + 0x00000000 (0x001B70CC) to 0x1001B70C4

他们是关于什么的?我不使用 -mdynamic-no-pic .我也没有真正看到 _PyBuiltin_Init我如何在那里使用绝对寻址。

另外,这些超出范围的绝对地址是什么? 编辑:这些是一些非常巨大的分配。我暂时删除了这段代码(这是 WITH_PYMALLOC ,如果有人对这些特定的 Python 内部结构感兴趣)。

当我在我的 iPhone 上启动它时,我得到了中止:
dyld: vm_protect(0x00001000, 0x00173000, false, 0x07) failed, result=2 for segment __TEXT in /var/mobile/Applications/C15D9525-E7DC-4463-B05B-D39C9CA24319/...
当我使用 -no_pie对于链接,它甚至没有链接。它失败了:
Illegal text-relocation to ___stderrp in /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/usr/lib/libSystem.dylib from _read_object in /Users/az/Programmierung/python-embedded/libpython.a(marshal.o) for architecture armv7
我解决了 PIE 禁用,绝对寻址错误。我有一个 -static在我的命令行 Clang 中。一旦我删除了它,警告就消失了,dyld/vm_protect 错误也消失了。这是它第一次真正运行一些代码。

直到我打 another strange error about integer comparison .因此,这看起来更像是他们 Clang 构建中的错误。

最佳答案

现在一切正常。基本上,答案是:

  • 只需编译每个 *.c文件照常发送到 *.o文件。唯一真正的区别是不同的 GCC/Clang,-arch armv7 , 不同的 SDK/包含目录。
  • 使用 libtool -static -o libfoo.a *.o构建静态库。

  • 而已。我的问题中的其他问题只是错误的尝试。

    关于ios - 如何链接 iOS 的静态库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11064984/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com