Xcode 10 (iOS 12) 不包含 libstdc++6.0.9

Posted

技术标签:

【中文标题】Xcode 10 (iOS 12) 不包含 libstdc++6.0.9【英文标题】:Xcode 10 (iOS 12) does not contain libstdc++6.0.9 【发布时间】:2018-11-14 15:06:40 【问题描述】:

我从 Apple 下载了最新的 Xcode,但发现无法搜索名为“libstdc++6.0.9”的库。

【问题讨论】:

尝试使用libc++ 而不是libstdc++ 您需要添加它不是吗?去年的类似问题...***.com/questions/36057291/libstdc-6-0-0-tbd-or-dylib 添加libc++ 对我不起作用,libstc++ 也不可用 【参考方案1】:

libstdc++ 在 5 年前被弃用。 Apple 最新的平台(tvOS 和 watchOS)不支持它。

ios 12.0 Simulator 运行时中删除了支持,但它仍保留在 iOS 12.0(设备)运行时中,以实现与发布应用程序的二进制兼容性。

您应该通过将 CLANG_CXX_LIBRARY 构建设置(“C++ 标准库”)设置为 libc++ 来更新您的项目以使用 libc++ 而不是 libstdc++。

如果您有任何依赖于 libstdc++.tbd 的静态库,您现在可以通过从 Xcode 9.4(以及 iOS 模拟器运行时中的 libstdc++.*.dylib)中的 SDK 复制文件来临时解决这个问题,但事实并非如此一个长期的解决方案。您应该联系这些库的提供者并请求使用 libc++ 构建的版本。

【讨论】:

【参考方案2】:

您可以从旧的 Xcode(9.4) 复制它。它应该可以工作。

cp /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/lib/libstdc++.* /Applications/Xcode-beta.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/lib/

cp /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/usr/lib/libstdc++.* /Applications/Xcode-beta.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/usr/lib/

【讨论】:

如果 Apple 希望移除对 lib 的支持,那么此解决方案可能不适用于 iTunes Connect 或未来的 iOS 版本。 @Cœur 没错,但如果您需要构建现有项目,这是一个不错的临时解决方案。 在模拟器上运行:dyld:库未加载:/usr/lib/libstdc++.6.dylib 引用自:/Users/root/Library/Developer/CoreSimulator/Devices/3D8BF0EC-E838-451D- A39D-E5723E0CD938/data/Containers/Bundle/Application/7168BA72-4111-44CB-92A3-20C5F5BF585B/VPDemo.app/VPDemo 原因:找不到合适的镜像。确实找到了:/usr/lib/libstdc++.6.dylib: mach-o,但不是为 iOS 模拟器构建的 @zhengwu119 同样的问题。 这对我来说并不完全有效,应用程序无法在模拟器上运行。我知道对 iOS12 的支持已被删除,但也许可以手动添加以使其可操作...【参考方案3】:

libstdc++ 在 iOS 12 中被移除。

我希望我在 Twitter 上有比 Apple 工程师更好的消息来源,但我只有这些。

@jeremyhu PSA: libstdc++ is gone from the iOS 12.0 SDK (it is present in the runtime for binary compatibility). It's days are numbered on macOS as well. Migrate over to libc++ if you haven't already. #WWDC2018 #cplusplus

编辑:这里有一个更好的来源,Xcode 10 补丁说明

使用 libstdc++ 构建已在 Xcode 8 中弃用,并且在针对 iOS 时在 Xcode 10 中不受支持。 C++ 项目现在必须迁移到 libc++,建议设置 iOS 7 或更高版本的部署目标。除了更改 C++ 标准库构建设置外,开发人员还应审核硬编码的链接器标志和目标依赖项以删除对 libstdc++ 的引用(包括 -lstdc++、-lstdc++.6.0.9、libstdc++.6.0.9.tbd 和 libstdc++.6.0。 9.dylib)。项目依赖项(例如针对 libstdc++ 构建的静态档案)也需要针对 libc++ 重新构建。 (40885260)

【讨论】:

【参考方案4】:

Xcode 10 取消了带有内置 lib 的 libstdc++ 库 所以我们应该手动将文件复制到lib中。

将文件:(libstdc++.6.0.9.tbd)和(libstdc++.6.tbd)复制到:

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/lib

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/usr/lib 

(请注意“iPhoneOS”和“iPhoneSimulator”的区别)

清理 xcode 并重建它。

Here 是文件。

【讨论】:

我从这个回复中提供的 github 位置下载了库,但是我收到一个关于库“对于 ARM 架构来说太小”的错误,所以我直接从苹果开发者门户下载了 XCode 9.4,未压缩它并手动复制了库,效果很好。谢谢! 工作就像一个魅力。谢谢 在某些情况下,您还需要复制dylib 文件。它们应该位于Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/【参考方案5】:

取自Xcode 10 Beta 2 release notes,适用于Xcode的所有未来版本:

使用 libstdc++ 构建已在 Xcode 8 中弃用,并且在 Xcode 10 中不支持 针对iOS。 C++ 项目现在必须迁移到 libc++ 并建议设置 iOS 7 或更高版本的部署目标。除了更改 C++ 标准库构建设置, 开发人员应审核硬编码的链接器标志和目标依赖项以删除引用 到 libstdc++(包括 -lstdc++、-lstdc++.6.0.9、libstdc++.6.0.9.tbd 和 libstdc++.6.0.9.dylib)。 项目依赖项(例如针对 libstdc++ 构建的静态档案)也需要 针对 libc++ 进行重建。 (40885260)

Apple 不太可能再次支持 libstdc++。

【讨论】:

这个答案帮助我修复了我的构建。我在项目顶部的“搜索”或“过滤器”栏中搜索“libstdc++”,并在 Xcode 中的目标窗口中搜索它。我在“Link Binary With Libraries”下的 Target 的 Build Phases 选项卡中找到了对它的引用。我通过按列表中的减号按钮删除了 libstdc++6.0.tbd。【参考方案6】:

更新到 xcode 10 后我也遇到了同样的问题。我通过从 https://github.com/Kila2/libstdc-.6.0.9.tbd 下载 libstdc++.6.0.9.tbd 和 libstdc++.6.tbd 解决了这个问题。

然后我将这些文件复制到我的项目文件夹中。 之后,我按照以下步骤在链接框架和库中添加了这些库: 项目 > 目标 > 常规 > 链接框架和库单击 (+) > 单击“添加其他”> 在“打开文件”中导航到您的项目文件夹,然后选择这些库并添加。

现在运行项目,它将完美运行..

【讨论】:

【参考方案7】:

因为苹果在Xcode 10.0中去掉了libstdc++,所以如果你想解决问题,可以尝试手动将文件复制到lib中。

1.iPhoneOSiPhoneSimulator 文件

将文件:libstdc++.6.0.9.tbdlibstdc++.6.tbdlibstdc++.tbd 复制到:

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/lib/

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/usr/lib/

2.iOS.simruntime文件

将文件:libstdc++.6.0.9.dyliblibstdc++.6.dyliblibstdc++.dylib 复制到:

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib

【讨论】:

对于/usr/lib/libstdc++.6.dylib: mach-o, but not built for iOS simulator的模拟器问题,可以尝试将原文件:libstdc++.6.0.9.dyliblibstdc++.6.dyliblibstdc++.dylib复制到:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib 你救了我的命。需要第二步。非常感谢。 +1。使用 Xcode 10 你可能只做第一步,但使用 Xcode 11 和 iOS 13 模拟器,你迫切需要第二步。【参考方案8】:

对我来说 -l"stdc++.6" 在pod install 期间添加 我在 'Pods/Target\ Support\ Files/Pods-SomeTarget/Pods-SomeTarget.debug.xcconfig' 中找到它

要解决这个问题,您可以在 Podfile 中使用 post_install 处理程序:

post_install do |installer|
    installer.pods_project.targets.each do |target|
        if target.name == "Pods-SomeTarget”
            puts "Updating #target.name OTHER_LDFLAGS"
            target.build_configurations.each do |config|
                xcconfig_path = config.base_configuration_reference.real_path
                xcconfig = File.read(xcconfig_path)
                new_xcconfig = xcconfig.gsub('-l"stdc++.6" ', '')
                File.open(xcconfig_path, "w")  |file| file << new_xcconfig 
            end
        end
    end
end

【讨论】:

【参考方案9】:

Jeremy Huddleston Sequoia 的回答给了我解决这个问题的方向。因此,在继续之前,请确保您已阅读他的答案。

即使在您的项目中更新了 C++ 库后,您也可能会遇到链接错误,即 Xcode 无法将您的项目与此 libstdc++ 库链接。

解决方案是 - 如果您的项目结构包含 libstdc++,它可能会变成红色,因为 Xcode 找不到它的引用。如果您从项目结构中删除该条目并添加新的库(libc++),那么您就可以开始了。

【讨论】:

【参考方案10】:

从旧 Xcode(9.4) 复制它适用于物理 iOS 设备。 对于Did find: /usr/lib/libstdc++.6.dylib: mach-o, but not built for iOS simulator 的模拟器问题。看起来苹果删除了对模拟器的兼容性支持。只需下载iOS 11.4模拟器即可运行。

【讨论】:

【参考方案11】:

对于模拟器,只需从 Linked Frameworks and Libraries 中删除 libstdc++.6.0.9.tbd。

【讨论】:

【参考方案12】:

您应该从 xcode 项目中的其他链接器标志中删除 libstdc++

检查这个:

【讨论】:

【参考方案13】:

我能够通过将必要的文件从 9.4 复制到 10.1 来解决构建问题,包括平台库和运行时。但它只解决了模拟器的情况。 在物理设备上运行时,我的应用程序仍然卡在启动时(启动画面)。

【讨论】:

【参考方案14】:

这会奏效。不要将 .dylib 文件从 /usr/lib 复制到 simruntime。

从 Xcode 9.4.1 复制到 Xcode 10.2.1 的文件和路径列表

A) 复制文件:libstdc++.6.0.9.tbd 和 libstdc++.6.tbd 和 libstdc++.tbd

来自 > Xcode9_41/Xcode9_41.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/usr/lib

到 > /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/lib

B) 复制文件:libstdc++.6.0.9.dylib and libstdc++.6.dylib and libstdc++.dylib

来自 > Xcode9_41/Xcode9_41.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib

to > /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib

【讨论】:

以上是关于Xcode 10 (iOS 12) 不包含 libstdc++6.0.9的主要内容,如果未能解决你的问题,请参考以下文章

关于Xcode10的那些事

libstdc++适配Xcode10与iOS12

Xcode 9.4 不支持 iOS 12:找不到设备支持文件

UIBarButtonItem 工作但在 Xcode 11 和 Xcode 12 中不可见

RobotFramework+Appium 为了兼容iOS12,升级至Xcode10后,WebDriverAgent编译不通过:Undefind symbols for architecture x8

我可以在 Xcode 9.2 中为 iOS 12 开发应用程序吗?