gpt4 book ai didi

iphone - 为 iPhone 交叉编译 libgcrypt?链接器错误...似乎找不到 "fwrite"和 "strerror"?

转载 作者:行者123 更新时间:2023-12-03 19:25:53 29 4
gpt4 key购买 nike

我已经成功cross-compiled the Apache Portable Runtime (APR) for the iPhone ,使用一组 configure scripts使用必要的交叉编译选项调用 GNU Autotools“./configure”。

我现在正在尝试交叉编译 GNUTLS,它依赖于 libtasn1 和 libgcrypt,而 libgcrypt 又依赖于 libgpg-error。这就是我遇到麻烦的地方,需要你的帮助......

我目前正在尝试交叉编译 libgpg-error。我之前使用的配置脚本运行良好; “./configure”过程干净地完成。当我运行“make”时出现问题。当我运行 make 时,一切似乎都已编译,但最后我收到以下令人讨厌的链接器错误:

/bin/sh ../libtool --tag=CC   --mode=link /Users/michaelsafyan/Downloads/libgpg-error-1.7/compile /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc-4.2  -std=c99 -arch armv6 -pipe -no-cpp-precomp --sysroot='/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk' -isystem /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk/usr/lib/gcc/arm-apple-darwin9/4.2.1/include/ -isystem /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk/usr/include -isystem /Developer/Platforms/iPhoneOS.platform/Developer/usr/include -isystem /opt/iphone-3.0/include -isystem /usr/local/iphone-3.0/include  -arch armv6 --sysroot='/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk' -L/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk/usr/lib -L/Developer/Platforms/iPhoneOS.platform/Developer/usr/lib -L/opt/iphone-3.0/lib -L/usr/local/iphone-3.0/lib -o gpg-error gpg_error-strsource-sym.o gpg_error-strerror-sym.o gpg_error-gpg-error.o  ./libgpg-error.la  /Users/michaelsafyan/Downloads/libgpg-error-1.7/compile /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc-4.2 -std=c99 -arch armv6 -pipe -no-cpp-precomp --sysroot=/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk -isystem /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk/usr/lib/gcc/arm-apple-darwin9/4.2.1/include/ -isystem /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk/usr/include -isystem /Developer/Platforms/iPhoneOS.platform/Developer/usr/include -isystem /opt/iphone-3.0/include -isystem /usr/local/iphone-3.0/include -arch armv6 --sysroot=/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk -o gpg-error gpg_error-strsource-sym.o gpg_error-strerror-sym.o gpg_error-gpg-error.o  -L/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk/usr/lib -L/Developer/Platforms/iPhoneOS.platform/Developer/usr/lib -L/opt/iphone-3.0/lib -L/usr/local/iphone-3.0/lib ./.libs/libgpg-error.aUndefined symbols:  "_fwrite$UNIX2003", referenced from:      _main in gpg_error-gpg-error.o  "_strerror$UNIX2003", referenced from:      _gpg_strerror in libgpg-error.a(libgpg_error_la-strerror.o)ld: symbol(s) not foundcollect2: ld returned 1 exit statusmake[3]: *** [gpg-error] Error 1make[2]: *** [all] Error 2make[1]: *** [all-recursive] Error 1make: *** [all] Error 2

关于如何让它发挥作用有什么想法吗?我正在编译的软件版本是:

  • libgpg 错误:1.7
  • libgcrypt:1.4.4
  • libtasn1:2.2
  • gnutls:2.8.4

请帮忙。谢谢。

更新

根据初步反馈,每个 SDK 在“$SDKROOT/usr/lib”中都有“libSystem.dylib”的副本。 “$DEVROOT/usr/lib”中没有 libSystem 的副本,其中:

  • $DEVROOT = "/Developer/Platforms/iPhoneOS.platform/Developer"
  • $SDKROOT = "$DEVROOT/SDKs/iPhoneOS$VER.sdk"

“libSystem”库包含每个符号的普通、未修饰版本,但不包含符号的“$UNIX2003”变体。我怀疑 GPG-ERROR 正在定义“_POSIX_C_SOURCE”、“_UNIX”或其他 UNIX 功能测试宏,并且包含在存在这些功能测试宏时将“$UNIX2003”附加到函数的恶意 header 。从包含目录列表中删除“$DEVROOT/usr/include”对于删除此错误消息没有任何效果。

作为最后的手段,我看到“ld”接受“-alias_list”选项,该选项允许指定一个包含“_fwrite _fwrite$UNIX2003”等条目的文件,以强制将这些 undefined symbol 解析为其未修饰的变体。如果可能的话,我想避免这个选项,因为它看起来很黑客并且有潜在的危险。

最佳答案

通常是 Unresolved symbol$UNIX2003意味着您是 linking against an older SDK than the one the existing object files were built against .

对我来说,一个看起来很奇怪的包含路径,请注意,我只是模糊地熟悉 Mac 开发,而对 iPhone 开发一点也不熟悉,就是路径

/Developer/Platforms/iPhoneOS.platform/Developer/usr/include

实际上并不在 SDK 文件夹中。如果是的话,你是否有可能从那里拾取了流氓符号?似乎不太可能,因为它在命令行中出现的时间晚于 SDK 包含路径。

也许这些符号是 _fwrite_strerror 的预期版本,因此 gpg_error-gpg-error.olibgpg -error.a 没问题,这确实是一个链接问题,尽管再次不太可能,因为您有

/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk/usr/lib

作为 -L 选项。我假设某个地方有一个 libSystem dylib?

我想首先要做的是确定 UNIX2003 版本的符号是否是您所期望的。我的猜测是,但正如我所说,我可能完全错了。 :)

其次,您可以尝试从 ld 获取详细输出,以查看它在哪里找到符号。我确信您可以设置一个环境变量来实现这一点,但我在 ld 的在线手册页中看不到任何列出的变量。 (更新:两个环境变量是 LD_TRACE_ARCHIVESLD_TRACE_DYLIBS 但它们的值可能与 -t 相同?)。

编辑:

好的,所以我对 UNIX2003 符号是必需的符号的看法是完全错误的。哈哈。

当你构建 libgpg-error 时,我认为它会创建一个文件

src/.deps/gpg_error-gpg-error.Po

其中包含 header 依赖项(至少在我的 Linux 系统上是这样)。这可能会提供有关在构建 gpg_error-gpg-error.o 时在何处拾取错误 header 的线索。

顺便说一句,看起来 libgpg-error 配置脚本同时接受 -isysroot-arch 选项。您不能使用这些来代替您自己的配置脚本版本吗?

编辑2:

好吧,让我们再试一次:)这里有一些可以尝试的事情,从干净的源文件夹开始:

  • 使用 -isysroot 而不是 --sysroot
  • 使用 -isysroot 以及 --sysroot
  • 通过重命名文件夹等方式暂时使正常的系统 header 不可用。希望构建会因找不到 header 而失败,并且它会告诉您确切的位置。

关于iphone - 为 iPhone 交叉编译 libgcrypt?链接器错误...似乎找不到 "fwrite"和 "strerror"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1620375/

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