學(xué)習(xí)筆記:XCode中多Target時CFBundleDisplayName的多語言本地化;用C++寫socket程序時編譯錯誤說read和write找不到
兩個小問題解決記錄:XCode中多Target時CFBundleDisplayName的多語言本地化;用C++寫socket程序時編譯錯誤說read和write找不到
?
第一個:在XCode同一個項目里創(chuàng)建了兩個target一個代表完整版一個代表lite版。按照網(wǎng)上找的方法對完整版的InfoPlist.strings做了本地化,CFBundleDisplayName有中英兩個版本,可以成功實現(xiàn)App應(yīng)用名稱的本地化。對lite版,新建了一個InfoPlist-lite.strings文件,也照樣弄了en和zh兩個版本,但lite版的顯示名稱就始終是Product Name所指定的字符串,沒能實現(xiàn)本地化。
最后經(jīng)試驗,發(fā)現(xiàn)這個.strings文件的名稱必須得是InfoPlist.strings才能被認,不像Info.plist那個文件可以任意命名只要在Build Settings里設(shè)置即可。所以最后是新建了另一個目錄專門去放Lite版的InfoPlist.strings文件,解決。
?
第二個:原先用C寫了個簡單的socket通信程序,gcc編譯及運行都沒問題。把后綴改成cpp,用g++編譯就出錯,說對socket進行讀寫的write和read不能被識別:
error:?use of undeclared identifier 'write'
?
error:?use of undeclared identifier 'read'
又上網(wǎng)查了一下,終于想起來,C++調(diào)用C的函數(shù)是應(yīng)該用extern "C"聲明一下的??赡苁莣rite和read所在的那個C函數(shù)庫太老,它自己沒有這樣聲明所以由于C++與C函數(shù)命名的不同造成編譯器不識別。于是在自己的程序里加上聲明就可以了:
?
extern?"C"?{
? ??int?write(int,void*,int);
? ??int?read(int,void*,int);
};
?
都是些小問題,呵呵。





