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





