iOS中的COCOAPODS+POSIX的坑

1.背景

????現(xiàn)在的移動端開發(fā),越來越追求iOS和Android能夠使用一套代碼就能二者兼得的模式。這種情況下由于不需要維護(hù)兩套代碼,因此在某種程度下能夠降低錯誤的風(fēng)險。
????二者融合的模式中眉踱,一種方式便是使用w3c標(biāo)準(zhǔn)的web形式,這也是Hybrid的主要概念來源霜威。于是各種Hybrid框架層出不窮谈喳,從PhoneGap到現(xiàn)在流行的React-Native都屬于此類。
????然而戈泼,事實上還有一種方式婿禽,便是采取純c/c++編寫程序,iOS和Android共享底層代碼來達(dá)到相同目的的方法矮冬。這里的標(biāo)準(zhǔn)叫做POSIX谈宛。我們也正是基于這種考慮,讓iOS, Android, PC 都公用一套代碼胎署,增加代碼的復(fù)用吆录,減少問題的發(fā)生概率。

2.我們的解決方案

????在iOS端琼牧,為了達(dá)到復(fù)用同一套C/C++代碼恢筝,并且不對原代碼破壞的目的哀卫,我們采用的也是CocoaPods的方案。使用CocoaPods將該功能所有的C/C++建立一套Pod庫撬槽,編譯成靜態(tài)庫此改,來達(dá)到共享的目的。

3.問題的產(chǎn)生

????工程師兄弟都知道侄柔,需求是在不斷進(jìn)(keng)步(die)的共啃。基于此暂题,底層的共享庫也會經(jīng)常地有所變動移剪。為了達(dá)到這次需求的目的,底層的兄弟直接從純C改用了C++編寫薪者,而這也是困擾了我整整兩天的問題根源纵苛。看到這里言津,可能會有懂行的產(chǎn)生疑問攻人,C++不是兼容C的嗎?
????對悬槽,沒錯怀吻,C++是兼容C;但是問題在于C初婆,并不兼容C++烙博。

4.尋源

????Apple的OS底層是XNU(Mach+Darwin), 也是一套遵循了POSIX標(biāo)準(zhǔn)的內(nèi)核,主要從UNIX中來烟逊。不過,它并不是100%兼容GNU/Linux的標(biāo)準(zhǔn)铺根,因此在C/C++的編譯上便會產(chǎn)生一系列偏差宪躯,雖然這種概率并不大。
????XCode中的libc++就是采用了Apple自己標(biāo)準(zhǔn)的C++協(xié)議庫位迂。如上所說访雪,這個庫會導(dǎo)致一些在Linux下編譯ok的庫在iOS上無法鏈接成功(非100%兼容GNU/C++)。
????這種情況下掂林,就需要使用Apple提供的另一個庫:libstdc++(libstdc++.6.0.9代表不同版本的libstdc++)臣缀,這個東西是GNU/C++ 100%兼容的。

5.兼容

????原以為解決以上問題就可以成功連接泻帮,卻還是出現(xiàn)undefine symbols錯誤精置。
????仔細(xì)想想,發(fā)現(xiàn)原來問題的關(guān)鍵在于.m文件锣杂。
????事實上脂倦,iOS中除了Object-C 開發(fā)番宁,還有一個東西叫做Object-C++。Object-C++文件是以.mm后綴結(jié)尾的赖阻。當(dāng)llvm編譯器看到.mm文件時蝶押,會自動調(diào)用Object-C++的標(biāo)準(zhǔn)來編譯和連接該文件。
????在之前的版本中火欧,底層的兄弟采用的是.c文件來編寫相關(guān)的代碼棋电;這次換成.cpp文件后,llvm編譯這樣文件時候編的是c++苇侵。而直接調(diào)用這些函數(shù)的代碼又是.m赶盔,即Object-C,遵循C標(biāo)準(zhǔn)衅檀。最后Linking階段導(dǎo)致了符號表找不到的問題招刨。
????修改.m文件后綴為.mm,編譯哀军,通過沉眶,收工。

6.經(jīng)驗

????C/C++并不一樣杉适。如果.m文件要調(diào)用的是在.cpp文件內(nèi)的函數(shù)谎倔,一定改成.mm。
libstdc++猿推、libstdc++.6.0.0片习、libc++都是不一樣的。如果一種庫連接不起來蹬叭,嘗試使用另一種藕咏,說不定可以帶來驚喜。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末秽五,一起剝皮案震驚了整個濱河市孽查,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌坦喘,老刑警劉巖盲再,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異瓣铣,居然都是意外死亡答朋,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進(jìn)店門棠笑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來梦碗,“玉大人,你說我怎么就攤上這事〔嫦遥” “怎么了丐一?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長淹冰。 經(jīng)常有香客問我库车,道長,這世上最難降的妖魔是什么樱拴? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任柠衍,我火速辦了婚禮,結(jié)果婚禮上晶乔,老公的妹妹穿的比我還像新娘珍坊。我一直安慰自己,他們只是感情好正罢,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布阵漏。 她就那樣靜靜地躺著,像睡著了一般翻具。 火紅的嫁衣襯著肌膚如雪履怯。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天裆泳,我揣著相機(jī)與錄音叹洲,去河邊找鬼。 笑死工禾,一個胖子當(dāng)著我的面吹牛运提,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播闻葵,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼民泵,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了槽畔?” 一聲冷哼從身側(cè)響起洪灯,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎竟痰,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體掏呼,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡坏快,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了憎夷。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片莽鸿。...
    茶點(diǎn)故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出祥得,到底是詐尸還是另有隱情兔沃,我是刑警寧澤,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布级及,位于F島的核電站乒疏,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏饮焦。R本人自食惡果不足惜怕吴,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望县踢。 院中可真熱鬧转绷,春花似錦、人聲如沸硼啤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽谴返。三九已至煞肾,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間亏镰,已是汗流浹背扯旷。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留索抓,地道東北人钧忽。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像逼肯,于是被迫代替她去往敵國和親耸黑。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫篮幢、插件大刊、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,103評論 4 62
  • 一條扭曲的蛇貫穿體內(nèi) 它是來自社會的陰溝和污水 怎樣才能擺脫它? 只有自己內(nèi)心的意志和堅定
    舒嚴(yán)閱讀 215評論 0 0
  • 很多年后,當(dāng)我們坐在窗臺三椿,窗外的陽光透過玻璃滲透到那發(fā)黃的書頁缺菌,我們看著黃昏里的群嵐,觸摸曾經(jīng)寫下紙上的字跡搜锰,你會...
    西蜀三三三閱讀 191評論 1 1
  • 今天抽牌時在想:今天又是新的一天伴郁,會有什么新的啟示給我?今天要開家長會,會不會有新的認(rèn)識? 抽中的是第一個火牌:源...
    美伊g閱讀 1,122評論 1 5