为iPhone交叉编译libgcrypt?链接器错误......似乎无法找到“fwrite”和“strerror”?

时间:2009-10-25 08:38:35

标签: iphone gcc linker cross-compiling

我已成功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.a
Undefined 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 found
collect2: ld returned 1 exit status
make[3]: *** [gpg-error] Error 1
make[2]: *** [all] Error 2
make[1]: *** [all-recursive] Error 1
make: *** [all] Error 2

有关如何使其发挥作用的任何想法?我正在编译的软件版本是:

      
  • libgpg-error: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”的流氓头。从包含目录列表中删除“$ DEVROOT / usr / include”对于删除此错误消息无效。

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

3 个答案:

答案 0 :(得分:0)

通常未解决的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的联机手册页中看不到任何内容。 (更新:两个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配置脚本同时接受-isysroot-arch选项。你能否使用它们而不是你自己的配置脚本版本?

<强> EDIT2:

好的,让我们再来吧:)以下是一些可以尝试的事情,从干净的源文件夹开始:

  • 使用-isysroot而不是--sysroot
  • 使用-isysroot以及--sysroot
  • 暂时使您的普通系统标头不可用,例如重命名文件夹。希望构建不会找不到标题,它会告诉你确切的位置。

答案 1 :(得分:0)

尝试使用-E预处理gpg_error-gpg-error.c然后搜索缺少的符号。你应该找到包含的地方(比如asm(“_”“nice”“@ UNIX2003”)。 然后,修改此标头(例如unistd.h以添加#warning“HERE”)。 现在,重新编译,你应该找到包含堆栈。

答案 2 :(得分:0)

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

man compat

我在最后通过设置

修复它之前已经捣乱了一段时间

-mmacosx-version-min=10.3

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

希望这有帮助。