A. ios中中怎麼查看程序libzbar.a的 架構
ZBar也是一個常用的二維碼識別軟體,並分別段亮提供了iOS和android的SDK可供使用,最終我選擇了ZBar進行二維陸燃模碼識別,它的注釋清晰,便於使用。 ZBar為我們提供了兩種使用方式,一種是直接調用ZBar提供早緩的ZBarReaderViewController打開一個掃描界面
B. 怎樣解決編繹問題:"ld:plicate symbol
場景:
解決TencentOpenAPI.framework與ZbarSDK中 _base64_encode 函數的沖突
後來在網路上搜尋,刪除掉 Other Linker Flag 的 -all_load 就可以解決靜態庫沖突的問題,
但是這樣做的話,會使一些外部的靜態庫,使用objc擴展函數(catagory)的方法失效。例如BaiMapApi
如果是有些庫使用到了擴展函數(catagory)可以分別對這個庫進行載入
使用:-force_load
-force_load BaiMapApi/libs/Release-iphoneos/libmapapi.a
(BaiMapApi是添加到當前目錄下的)
或
-force_load $(BUILT_PRODUCTS_DIR)/libxxx.a
(這里是直接添加靜態庫項目源碼的做法)
使用-force_load分別進行載入還是蠻方便的,如果有些函數加入了main函數使用all_load就相當麻煩了。
以坦圓上可以解決TencentOpenAPI.framework與ZbarSDK的沖突
如果兩個靜態庫沖突的結構是相同的,可以考慮將兩個靜態庫拆分出來進行合並。
查看文件的架構有哪些
$ lipo -info libzbar.a
Architectures in the fat file: libzbar.a are: armv7 (cputype (12) cpusubtype (11)) i386
將armv7解壓出來
lipo libzbar.a -thin armv7 -output libzbar-armv7.a
新建立一個文件夾出來存放解壓的(.o)文件
$ mkdir armv7
$ cd armv7
將靜態庫中的文件解壓
$ ar -x ../libzbar-armv7.a
然後將另一個靜態庫根據以上的步驟做一遍,然後觀察連個解壓的靜態庫中,有那些是一樣的就合並在一起,不過注意的是兩個靜態庫沖突的(.o)文件必須一致,否則也會出現錯誤。
合並完後進行打包了
$ libtool -static -o ../libnew-armv7.a *.o
如果像在虛擬機也使用,進行相同的步驟後,將i386的架構合並再一起就可以了。
合並靜態庫
$ lipo -create -output lib.a libnew-armv76.a libi386.a
plicate symbol是一種常見的鏈接錯誤,不像編譯錯誤那樣可以直接定位到問題的所在。但是經過一段時間的總結,發現這種錯誤總是有一些規律可以找的。
例如,我們有如下的最簡單的兩個類代碼:
// ClassA.h
#import <Foundation/Foundation.h>
@interface ClassA : NSObject
@end
// ClassA.m
#import "ClassA.h"
@implementation ClassA
@end
// ClassB.h
#import <Foundation/Foundation.h>
@interface ClassB : NSObject
@end
// ClassB.m
#import "ClassB.h」
@implementation ClassB
@end
編譯後出現的錯誤信息如下:
plicate symbol _OBJC_METACLASS_$_ClassA in:
/Users/dajie/Library/Developer/Xcode/DerivedData/linkTest-cpjaaatiyqpvxcbzfzpklcbqrgqg/Build/Intermediates/野拍linkTest.build/Debug-iphonesimulator/linkTest.build/Objects-normal/i386/讓脊塌ClassA.o
/Users/dajie/Library/Developer/Xcode/DerivedData/linkTest-cpjaaatiyqpvxcbzfzpklcbqrgqg/Build/Intermediates/linkTest.build/Debug-iphonesimulator/linkTest.build/Objects-normal/i386/ClassB.o
plicate
symbol _OBJC_CLASS_$_ClassA in:
/Users/dajie/Library/Developer/Xcode/DerivedData/linkTest-cpjaaatiyqpvxcbzfzpklcbqrgqg/Build/Intermediates/linkTest.build/Debug-iphonesimulator/linkTest.build/Objects-normal/i386/ClassA.o
/Users/dajie/Library/Developer/Xcode/DerivedData/linkTest-cpjaaatiyqpvxcbzfzpklcbqrgqg/Build/Intermediates/linkTest.build/Debug-iphonesimulator/linkTest.build/Objects-normal/i386/ClassB.old:
2
plicate symbols for architecture i386clang:
error: linker command failed with exit code 1 (use -v to see invocation)
從上面出現問題的地方,我們應該能推測出是ClassA這個類出了問題。如果這個類是我們自己寫的,就容易辦一些。
可以考慮以下原因:
1.引入頭文件時,由於疏忽,誤引入.m文件。這種一般仔細檢查一下出現問題的類的源文件就能發現。
例:ClassB.m 文件修改成下面這樣
#import "ClassB.h>"
#import "ClassA.m」 // 這句話有問題
@implementation ClassB
@end
2.同一個類,實現兩次,即有兩個@implementation 。這種一般會有一個警告,也比較容易發現。
例:ClassB.m文件修改成下面這樣:
// ClassB.m
#import "ClassB.h」
@implementation ClassB
@end
@implementation ClassA
@end
3.工程文件,同一個類文件被引入了兩次,引起這種錯誤的原因大概有兩種:一是多人協作開發時,導致project文件合並沖突;二是同名文件不在同一目錄下,添加到工程時造成重復添加。 這種一般在文件視圖,用名字過濾器檢查一下就發現了。
4.
Targets的Build Phase設置項里,查看Complie
Sources這一項,看看出現問題的類是不是有重復的,用文件名過濾也比較容易發現。這種問題一般也是多人協作開發時,project文件沖突導致的。
發現這種問題,只要刪除就可以了。不過在我解決問題過程中,刪除其中一個文件時,重復文件會自動全部刪除,所以還需要單獨添加一下。
5.如果我們的工程中引用了第三方的庫,而恰好第三方的庫裡面有一個ClassA,也會出現這種問題。如果不能修改第三方的庫代碼,只能修改我信自己的代碼了。
C. android開發 如何實現掃描本地二維碼圖片
開源的二維碼掃描庫主要有zxing和zbar,zbar在iPos平台上應用比較成熟,而在Android平台上主流還是用zxing庫,因此這里主要講述如何利用zxing進行二維碼開發。
如何將zxing的Android源碼導入工程。
在導入zxing的android源碼之前,先去官方下載zxing的源碼http://code.google.com/p/zxing/downloads/list。
這里以1.6版本為例,zxing 1.6源碼結構如下:
<?xmlversion="1.0"encoding="utf-8"?>
<manifestxmlns:android="http://schemas.android.com/apk/res/android"
package="com.qrcode"
android:versionCode="1"
android:versionName="1.0">
<uses-sdkandroid:minSdkVersion="7"/>
<uses-permissionandroid:name="android.permission.VIBRATE"/><!--震動許可權-->
<uses-permissionandroid:name="android.permission.CAMERA"/>
<uses-featureandroid:name="android.hardware.camera"/><!--使用照相機許可權-->
<uses-featureandroid:name="android.hardware.camera.autofocus"/><!--自動聚焦許可權-->
<applicationandroid:icon="@drawable/icon"android:label="@string/app_name">
<activityandroid:name=".MainActivity"
android:label="@string/app_name">
<intent-filter>
<actionandroid:name="android.intent.action.MAIN"/>
<categoryandroid:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<!--隱藏鍵盤--><!--全屏-->
<activity
android:configChanges="orientation|keyboardHidden"
android:name="com.zxing.activity.CaptureActivity"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
android:windowSoftInputMode="stateAlwaysHidden">
</activity>
</application>
</manifest>
這種情況大致就可以實現二維碼掃描了,想細化的話,還可以多看看安卓二維碼掃描開發相關的教程
D. android zbar能不能生成二維碼
ZBarReaderViewController *reader = [ZBarReaderViewController new];
reader.readerDelegate = self;
reader.sourceType = ;
這個地方可以設置sourceType,有三種:
// , 打開所有照片 獲取二維碼
// , 打開攝像頭 獲取二維碼
// 打開相冊 獲取二維碼
你可以自己選擇
E. iOS 兩個靜態庫存在同名文件沖突解決方案
摘要:之前在做項目時,遇到了兩個靜態庫中存在base64.o文件沖突(支付寶SDK與QQ分享SDK),在網上查找了各種資料,最後決定把其中一個.a文件的base64.o文件拆分出去,再重新打包靜態庫,但最後沒能成功,附上靜態庫一些終端操作:1.查看文件的架構有哪些$lipo-infoAlipayRsaLib.aArchitecturesinthefatfile:libzbar.aare:armv7(cputype(12)cpusubtype(11))i386可以看到靜態庫中bao'
之前在做項目時,遇到了兩個靜態庫中存在base64.o文件沖突(支付寶SDK與QQ分享SDK),在網上查找了各種資料,最後決定把其中一個.a文件的橡歷base64.o文件拆分出去,再重新打包靜態庫,但最後沒能成功,附上靜態庫一些終端操作:
1.查看文件的架構有哪些
可以看到靜態庫中bao'h包含了三種cpu架構的.a文件 armv7 armv7s即(cputype (12) cpusubtype (11)) i386(模擬器)
2.將armv7解壓出來(armv7替換成i386即可解壓i386格式.a)
3.新建立一個文件夾出來存放解壓的(.o)文件
4.將靜態庫中的文件解壓
在完成上述步驟後,我們要把其中的base64.o文件移除,再把其餘的.o文件重新打包成對應cup框架的.a文件
5.合並完後進行打包.o文件了
6.合並靜態庫
本來以為這樣就可以解決沖突問題,後來打包時才發現armv7s (cputype (12) cpusubtype (11))架構的.a文件無法拆分出來,上面打包的靜態庫激如州不包含armv7s格式,在iphone5後面版本的真機上部分功能將失效,既然這個方法行不通,那就只能另想其它方案了。於是繼續在網上查找資料,最後了解到明蔽網上的對Build Settings——Other Linker Flags配置解釋:
all_load就是會載入靜態庫文件中的所有成員,-ObjC就是會載入靜態庫文件中實現一個類或者分類的所有成員,-force_load(包的路徑)就是會載入指定路徑的靜態庫文件中的所有成員。所以對於使用runtime時候的反射調用的方法應該使用這三個中的一個進行link,以保證所有的類都可以載入到內存中供程序動態調用
在拿不到靜態庫源碼情況下 ,只能採用-force_load+庫文件路徑方法設置Other Linker Flags,逐個加靜態庫,最終完美解決,發現那個靜態庫無法調用,就採用以下語句添加進去。
(-force_load後面為靜態庫文件路徑,根據自己項目對應路徑)
原文地址: iOS 兩個靜態庫存在同名文件沖突解決方案
在第5步打包.o文件,不太明確,添加一下個人注釋。libNew為解壓.a文件後存放.o文件的文件夾,libNew.a為新生成的.a文件。
F. 為什麼 iOS 有那麼多優秀的開源組件,而 Android 反而很少
我做Android做了大約3年,做的雖然都是描繪Application層的小玩意,但是對整套生態圈應該感覺還是有點小了解;趕腳題主這個問題就有點黑安卓的意思,在我看來,這樣的問題和「為什麼C語言要比JAVA快」一樣沒有非常大的實際意義。所以感覺題主從主觀上在做安卓的時候歷銀受到了挫折,哈哈。
首先我想說的是,Android上的開源組件並不少。
具體項目我就不多說了,各位同仁也在分享,而且git和group上多的一筆,像UIL(Universal Image Loader)這種神器,還有SherlockActionBar(已經被歸入support v7,並且在最新版本的ADT中已經被強制填入),很強大的Zxing這個一維碼、二維碼通吃的好玩敏燃意;還有什麼pull-to-refresh的lib等等,同樣我也希望在這個主題裡面能看到更多同僚的分享。
相比來說,就以一二維碼為例,zxing對iOS的支持就不怎麼樣,同事在搞iOS上的條碼掃描和生成的時候,費了很大的功夫,且效果不理想,條碼二維碼這個近幾年很火吧?可是iOS上沒有一套完整的東西,zbar什麼的,看了幾個,都不理想,或多或少有欠缺。
所以我的觀點的話,就這件事上,我是不同意樓主的觀點的,首先jdk&android都是開源的,所以不考慮難度和質量來說,更容易開發出來一套工具lib或者框架;其次Android有Google這個爹,本著Google精神,有很多人願意去分享自己的東西;再者我們從實際開發來講,又或許是我做的項目都很小、很白痴,我沒有覺得Android的第三方開源小玩意少肢拿宴,很多玩意都能找到相關的解決辦法(現成代碼)。
於是我想了解下題主在什麼契機下覺得Android的開源項目少呢?Android本身就是個開源項目呀。