4

我已经成功地交叉编译了适用于 iPhone 的 Apache Portable Runtime (APR),使用一组配置脚本调用 GNU Autotools "./configure" 以及必要的交叉编译选项。

我现在正在尝试交叉编译依赖于 libtasn1 和 libgcrypt 的 GNUTLS,而后者又依赖于 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-错误.a
未定义的符号:
  “_fwrite$UNIX2003”,引用自:
      _main 在 gpg_error-gpg-error.o
  “_strerror$UNIX2003”,引用自:
      _gpg_strerror 在 libgpg-error.a(libgpg_error_la-strerror.o)
ld:未找到符号
collect2: ld 返回 1 个退出状态
make[3]: *** [gpg-error] 错误 1
make[2]: *** [all] 错误 2
make[1]: *** [all-recursive] 错误 1
make: *** [全部] 错误 2

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

  • libgpg 错误:1.7
  • libgcrypt:1.4.4
  • libtasn1:2.2
  • 坚果: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”附加到函数的流氓头文件被包括在内。从包含目录列表中删除“$DEVROOT/usr/include”对于删除此错误消息没有任何影响。

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

4

3 回答 3

0

通常,未解析的符号$UNIX2003表示您链接的是较旧的 SDK,而不是构建现有目标文件的.

一个奇怪的包括路径给我,请注意,我只是模糊地熟悉 Mac 开发,而不是 iPhone 开发,是路径

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

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

也许相反,这些符号是_fwriteand_strerror和 so的预期版本,gpg_error-gpg-error.o并且libgpg-error.a可以,这确实是一个链接问题,尽管您再次不太可能

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

作为 -L 选项。我假设那里有一个libSystem dylib?

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

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

编辑:

好的,所以我完全错误地认为 UNIX2003 符号是必需的。哈哈。

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

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

其中包含头文件依赖项(至少在我的 Linux 系统上是这样)。这可能会提供一个线索,说明它在构建 gpg_error-gpg-error.o 时在哪里拾取了错误的标头。

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

编辑2:

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

  • 使用 -isysroot 代替 --sysroot
  • 使用 -isysroot 以及 --sysroot
  • 暂时使您的正常系统标头不可用,例如,重命名文件夹。希望构建会因找不到标头而失败,它会告诉您确切的位置。
于 2009-10-31T03:34:25.500 回答
0

尝试使用 -E 预处理 gpg_error-gpg-error.c 然后搜索丢失的符号。您应该从包含的位置找到(类似于 asm ("_" "nice" "@UNIX2003")。然后,修改此标头(例如 unistd.h 以添加#warning "HERE")。现在,重新编译,你应该找到包含堆栈。

于 2010-03-05T14:12:59.513 回答
0

$2003 后缀是编译器在某些情况下生成的,您可以在 compat 的手册条目中找到完整的文档

man compat

我为此挣扎了一段时间,然后最终通过设置来修复它

-mmacosx-version-min=10.3

10.4 之前的任何版本都可以完成这项工作。我怀疑鉴于 Troubadour 的回答,我最好使用 ld 的 -t 选项搜索错误链接的库

希望这可以帮助。

于 2011-11-07T12:24:28.057 回答