一耙厚、 libstdc++ 庫(kù)
項(xiàng)目用到了c++逗载,依賴了libstdc++.tbd和libstdc++.6.0.9.tbd,導(dǎo)致整個(gè)工程編譯不通過(guò)朴乖,報(bào)出Undefined symbols犀盟,C++ 的 List 找不到了,原因是蘋(píng)果在XCode10和iOS12中移除了libstdc++這個(gè)庫(kù)俊性,由libc++這個(gè)庫(kù)取而代之,蘋(píng)果的解釋是lib轉(zhuǎn)載自斗玩網(wǎng)stdc++已經(jīng)標(biāo)記為廢棄有5年了透敌,建議大家使用經(jīng)過(guò)了llvm優(yōu)化過(guò)并且全面支持C++11的libc++
庫(kù)盯滚。
網(wǎng)上看到其他兄dei用Xcode9里面的導(dǎo)入到Xcode10
拷貝過(guò)去后,你就可以在新XCode10下面看到libstdc++了酗电,放心的添加到工程里
顯然魄藕,這方法并不是我們老中醫(yī)的套路
正確解決辦法
如果你自己的業(yè)務(wù)模塊使用了libstdc++,那么就把模塊代碼重新調(diào)整為依賴libc++撵术,然后重新檢查是否存在問(wèn)題背率,重新編譯
如果你引用的三方庫(kù)使用了libstdc++,那么向三方庫(kù)尋求支持嫩与,進(jìn)行升級(jí)
https://juejin.im/post/5b1634f0f265da6e61788998
問(wèn)題與解決
重復(fù)文件報(bào)錯(cuò)
一上來(lái)就是build沒(méi)2秒就報(bào)錯(cuò)了寝姿,看報(bào)錯(cuò)的說(shuō)法是有重復(fù)的info.plist。
<article data-v-13f76525="" itemscope="itemscope" itemtype="http://schema.org/Article" class="article" data-v-3f216172="">
一上來(lái)就是build沒(méi)2秒就報(bào)錯(cuò)了划滋,看報(bào)錯(cuò)的說(shuō)法是有重復(fù)的info.plist饵筑。
<figure><figcaption></figcaption>
</figure>
我們組件化后把一些三方庫(kù)和封裝方法打成了一個(gè)私有庫(kù)。進(jìn)去看了一下处坪,我們使用了阿里云統(tǒng)計(jì) + 推送 + Alipay
根资,里面確實(shí)有好幾個(gè)info.plist
,刪除了就好了同窘。
<figcaption></figcaption>
</figure>
補(bǔ)充
臨時(shí)解決方案也可以參考 掘金@來(lái)來(lái)來(lái)小牛仔在評(píng)論中提到的:
參考Stack Overflow中Xcode 10 Error: Multiple commands produce玄帕,修改Xcode編譯配置
Xcode->File->Project Settings/Workspace Setting-> Build System -> Legacy Build System.
這里定義為臨時(shí)解決方案的原因是:使用了Xcode10編譯的新特性而拋出錯(cuò)誤,既然是編譯器的特性想邦,那么最好還是接受它的報(bào)錯(cuò)去修復(fù)裤纹。作為短暫的過(guò)渡使用老的編譯方式是可以的,長(zhǎng)期我個(gè)人覺(jué)得是不合適的丧没。
c++.6.0.9消失了鹰椒?
報(bào)錯(cuò):library not found for -lstdc++.6.0.9
<figcaption></figcaption>
</figure>
第一反應(yīng)是去Build Phases
里的Link Binary With Libraries
進(jìn)行添加,然后發(fā)現(xiàn)選擇frameworks and libraries
里已經(jīng)沒(méi)有了這個(gè)庫(kù)了??骂铁,又回去看了一下Xcode9里是有的吹零。
<figcaption></figcaption>
</figure>
但是因?yàn)橹霸赬code9上是正常跑的項(xiàng)目,而且我們組件化后拉庵,依賴是在私有庫(kù)的podspec里定義的灿椅,全局搜了下所有的podspec并沒(méi)有依賴過(guò)這個(gè)lib。
想起來(lái)pod isntall
后會(huì)有一個(gè)Pods-xxxx.xcconfig
文件,果然找到了這個(gè)-l stdc++.6.0.9
茫蛹,但是這邊是匯總了所有的依賴操刀,無(wú)法找到源頭。
<figcaption></figcaption>
</figure>
那如果直接在這里刪掉這個(gè)依賴呢婴洼?是不是會(huì)爆出更清晰的錯(cuò)骨坑? 答案是就如下圖,因?yàn)閯h掉了這個(gè)依賴柬采,那依賴這個(gè)lib的源碼就出現(xiàn)了一些調(diào)用方法的報(bào)錯(cuò)欢唾,如下圖,很明顯的發(fā)現(xiàn)了這個(gè)叫libQYSDK.a
的庫(kù)粉捻。恩礁遣,就是三方庫(kù)七魚(yú)客服
了??,趕緊聯(lián)系了一波工具提供方肩刃。
<figcaption></figcaption>
</figure>
補(bǔ)充
臨時(shí)方案可以參考:掘金@End在評(píng)論區(qū)提到
將Xcode9的libstdc++6.0.9.tbd拷貝到Xcode10中使用祟霍。
感謝 掘金@vvveiii提醒,之前在文檔里沒(méi)有查到相關(guān)信息盈包,剛剛再去開(kāi)發(fā)者論壇中看到Where is libstdc++.6.dylib in xcode10 beta以及 libstdc++ is not supported by the tvOS platform?中 staff的回應(yīng)是請(qǐng)遷移到libc++
庫(kù)沸呐。
所以Xcode10
中libstdc++
相關(guān)的3個(gè)庫(kù)(libstdc++
、libstdc++.6
呢燥、libstdc++6.0.9
)應(yīng)該都是被徹底廢棄了崭添,如果你使用的三方庫(kù)中有依賴,請(qǐng)盡快和提供方溝通疮茄,告知他們遷移吧滥朱。如果自己開(kāi)發(fā)使用根暑,也盡快考慮遷移的事宜吧力试。
Copy Pods Resources失效
經(jīng)過(guò)上面一波操作后,終于編譯通過(guò)了排嫌,也跑起來(lái)畸裳,就在以為一切都正常起來(lái)的時(shí)候,突然 崩淳地!潰怖糊!了!
一看報(bào)錯(cuò)原因颇象,是Profile.StoryBoard
沒(méi)有找到伍伤,我們做了組件化后很多資源文件是在各自的pod里的,理論上這個(gè)sb應(yīng)該在執(zhí)行Copy Pods Resources
后被copy到在*.app
的包里
<figcaption></figcaption>
</figure>
于是去查看了一下編譯后生成的Product遣钳,所有組件庫(kù)的資源文件 都扰魂!不!在!
懷疑是這個(gè)指令沒(méi)有執(zhí)行劝评,然后clear重新編譯姐直,盯著編譯過(guò)程。果然蒋畜,只執(zhí)行了Check Pods Manifest.lock
和Embed Pods Frameworks
声畏。
<figcaption></figcaption>
</figure>
看了下CocoaPods的issues里沒(méi)有人提到這些,估計(jì)新版是好的姻成,趕緊裝了CocoaPods-1.5.3再把Pods文件夾刪了重新install一下插龄,就好了。
補(bǔ)充
確實(shí)是需要升級(jí)CocoaPods
版本>=1.4.0
以上科展,可見(jiàn)Github上的一個(gè)issues Xcode10 beta can't load bundles from CocoaPods
至此我們的工程已經(jīng)能正常通過(guò)Xcode 10
編譯辫狼,并運(yùn)行在iOS 12 beta
的手機(jī)上了。
粗略對(duì)一些業(yè)務(wù)場(chǎng)景進(jìn)行了使用辛润,沒(méi)有發(fā)現(xiàn)明顯需要進(jìn)行處理的問(wèn)題??
后續(xù)如果有發(fā)現(xiàn)有意義的問(wèn)題會(huì)繼續(xù)更新~
</article>
作者:寰宇
鏈接:https://juejin.im/post/5b1634f0f265da6e61788998
來(lái)源:掘金
著作權(quán)歸作者所有膨处。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處砂竖。