【问题标题】:Undefined external symbol in shared library共享库中未定义的外部符号
【发布时间】:2026-01-24 09:05:02
【问题描述】:

我最近在 iOS SDK4.3 的System.B.dylib 库上运行了nm -m -p -g,惊讶地发现很多标记为(undefined) (external) 的符号。为什么以及何时将未定义的符号标记为外部?我可以理解标记为lazyweak 的未定义外部符号,但这些不是。许多pthread_xxx 函数都属于这一类。但是,当我与此库链接时,所有符号都已解析。 pthread_xxx 符号是在 \usr\lib\system 文件夹中的一个库中定义的,所以我假设它们从那里得到满足。在链接期间它是如何工作的?

【问题讨论】:

    标签: c ios linker undefined-symbol nm


    【解决方案1】:

    自从我成为nmld C 编码忍者以来已经有一段时间了,但我认为这仅意味着此链接指向的其他库。

    【讨论】:

    • 但是为什么要将它们标记为外部?像我这样链接到这个库的应用程序是如何让它们快乐而不是让它们抱怨未定义的符号?那里有这些符号的存根版本吗?
    【解决方案2】:

    通常这就是动态链接的工作方式。如果您要对 System.B 的静态存档进行 nm 处理,您将不会观察到这种行为。 System.B.dylib 本身不会做太多事情。除非您将其作为一组动态和静态库的一部分,这些库的功能使用它。如果您现在尝试编译您的最终二进制文件但省略库路径'/usr/lib/system',那么您的链接器将发出错误并退出并显示错误,告诉您它找不到对 pthread_XXX() 的引用(使用上面的示例)。在二进制文件的最终组装过程中,它需要确保它知道所使用的每个函数的位置。

    HTH

    【讨论】:

    • 我没有指定/usr/lib/system,也没有抱怨。
    • 您是在使用 Xcode 还是在命令行手动执行链接?