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

49

我从苹果下载了最新的Xcode,但是发现无法搜索名为"libstdc++6.0.9"的库。

无法搜索libstdc++

2
尝试使用 libc++ 而不是 libstdc++ - Anbu.Karthik
你需要添加它,不是吗?类似的问题去年也有... https://dev59.com/DpXfa4cB1Zd3GeqPaymX - Scriptable
3
我无法添加 libc++,而且 libstdc++ 也不可用。 - sgdesmet
14个回答

44

libstdc ++在5年前就已经被弃用了。 苹果的更近期的平台(tvOS和watchOS)不支持它。

iOS 12.0模拟器运行时已删除对其的支持,但为了与发布的应用程序二进制兼容性保持一致,iOS 12.0(设备)运行时仍然支持它。

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

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


23

您可以从旧版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/

如果苹果希望移除对该库的支持,那么这个解决方案可能无法在iTunes Connect或未来的iOS版本中使用。 - Cœur
@Cœur 这是正确的,但如果您需要构建现有项目,则这是一个可以接受的临时解决方案。 - NKorotkov
在模拟器上运行: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
@zhengwu119 这里也有同样的问题。 - user1007522
这对我来说并不完全有效,应用程序无法在模拟器上运行。我知道支持已经被移除了iOS12,但也许可以手动添加以使其可操作... - silentBob
我在使用 Xamarin Visual Studio 项目时遇到了相同的问题,这个解决方案对我也起作用。我还尝试从这个帖子中的另一个回复中下载库(有人将它们上传到了 Github),但那些库给我带来了一些奇怪的错误,说它们“对 ARM 架构来说太小了”。所以如果你有这个问题,请跳过麻烦,直接从 Apple 下载 Xcode 并从那里复制。 - cesar-moya

18

libstdc++在iOS 12中已被移除。

我希望我有比Twitter上的苹果工程师更好的消息来源,但这就是我所拥有的。

@jeremyhu PSA:libstdc++在iOS 12.0 SDK中已经不再使用(它在二进制兼容性方面在运行时仍然存在)。 它的日子也在macOS上受到限制。 如果您还没有迁移到libc ++,请立即进行迁移。 #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)


13

Xcode 10取消了内置的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并重新构建它。 这里是该文件。

2
我从回复中提供的github位置下载了库,但是我遇到了一个关于库“对ARM架构太小”的错误,所以我直接从苹果开发者门户网站下载了XCode 9.4,解压并手动复制了库,这样就完美地解决了问题。谢谢! - cesar-moya
像魔法一般有效。谢谢。 - Nishant Mendiratta
在某些情况下,您还需要复制dylib文件。它们应该位于Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/ - khcpietro

9
Xcode 10 Beta 2 发布说明 获取,适用于所有未来版本的 Xcode:

自 Xcode 8 开始,使用 libstdc++ 构建已被弃用,并且在面向 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)

苹果公司不太可能再次支持 libstdc++。


2
这个答案帮助我修复了我的构建。我在Xcode的项目和目标窗口的搜索或过滤栏中搜索“libstdc++”,然后进行了清理。我在Target的Build Phases选项卡下找到了它的引用,位于“Link Binary With Libraries”下。我通过按列表中的减号按钮删除了libstdc++6.0.tbd。 - aaronsti

5

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

然后,我将这些文件复制到我的项目文件夹中。之后按照以下步骤添加这些库到“链接的框架和库”中:

Project > Target > General > Linked Frameworks and Libraries 点击(+) > 点击'Add Other' > 在'Open File'中导航到你的项目文件夹并选择这些库并添加。

现在运行该项目,它将完美运行。


4
由于苹果在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

1
对于模拟器问题/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 - RamboLu
你救了我的命。需要第二步。非常感谢。 - Luat Vu Dinh
使用Xcode 10,您可能只需要执行第一步,但是在Xcode 11和iOS 13模拟器中,您必须紧急执行第二步。 - Luat Vu Dinh

2

在我的 pod install 过程中,-l"stdc++.6" 被添加了。

我在 '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

1

Jeremy Huddleston Sequoia的答案给了我解决这个问题的方向。所以在继续之前,请确保你已经阅读了他的答案。

即使在更新项目中的C++库之后,您可能仍会面临链接错误,其中Xcode无法将您的项目与此libstdc++库链接起来。

解决方法是 - 如果您的项目结构包含了libstdc++,它可能变成了红色,因为Xcode找不到它的引用。如果您从项目结构中删除该条目并添加新的lib(libc++)代替,您就可以继续了。


0

你应该从 Xcode 项目的其他链接器标志中删除 libstdc++。

请查看: 在此输入图片描述


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接