動態庫替換後需要重新編譯嗎
㈠ 動態庫鏈接編譯
這里的動態的意思應該是模塊代碼是動態載入的
而不是隨著應用程序一起編譯
只要動態庫里的函數介面不變
應用程序就無需重新編譯
只需將動態庫重新編譯後替換掉舊的動態庫即可
如果動態庫的函數介面有變動
那麼應用程序就要重新編譯發布
這也是我的個人理解~~~
㈡ c++socket鏈嶅姟鍣ㄥ疄鐜頒笉鍋滄満鏇存柊
C++鐨凷ocket鏈嶅姟鍣ㄥ疄鐜頒笉鍋滄満鏇存柊閫氬父鏈変袱縐嶆柟娉曪細鐑閲嶅惎鍜屽弻榪涚▼妯″紡銆
鐑閲嶅惎鏄鎸囧湪鏇存柊浠g爜鎴栭厤緗鏂囦歡鍚庯紝鏃犻渶鍋滄㈡湇鍔″櫒紼嬪簭錛岄氳繃鏌愮嶆満鍒惰╂湇鍔″櫒鍦ㄥ悗鍙板姞杞芥柊鐨勪唬鐮佹垨閰嶇疆鏂囦歡錛屽苟瀹屾垚鐩稿簲鐨勬洿鏂版搷浣溿傝繖縐嶆柟寮忓彲浠ラ伩鍏嶆湇鍔″櫒鍋滄満鏃墮棿榪囬暱錛屽悓鏃朵繚鎸佸硅繛鎺ョ殑緇х畫澶勭悊銆傚父鐢ㄧ殑瀹炵幇鏂瑰紡鏈変袱縐嶏細鍔ㄦ侀摼鎺ュ簱鏇挎崲鍜岃繘紼嬮棿閫氫俊銆
鍔ㄦ侀摼鎺ュ簱鏇挎崲鏄鎸囧皢鏈嶅姟鍣ㄧ▼搴忔瘡涓妯″潡緙栬瘧涓哄姩鎬侀摼鎺ュ簱錛屽綋鏇存柊鏃訛紝鍙闇緙栬瘧鏇挎崲鏌愪釜妯″潡鐨勫姩鎬侀摼鎺ュ簱錛岀劧鍚庨氱煡鏈嶅姟鍣ㄩ噸鏂板姞杞借ュ姩鎬侀摼鎺ュ簱鍗沖彲銆傝繖縐嶆柟寮忕殑浼樺娍鍦ㄤ簬鏇存柊鏃朵笉浼氬獎鍝嶅叾浠栨ā鍧楋紝浣嗙熷洟闇瑕佷繚璇佹湇鍔″櫒紼嬪簭鐨勭粨鏋勫彲浠ュ姩鎬佸姞杞藉拰鍗歌澆銆
榪涚▼闂撮氫俊鏄鎸囧惎鍔ㄤ竴涓鏂扮殑鏈嶅姟鍣ㄨ繘紼嬶紝灝嗘柊浠g爜鍜岄厤緗鏂囦歡鍔犺澆鍒版柊榪涚▼涓錛岀劧鍚庡皢鏂拌繘紼嬩笌鏃ц繘紼嬭繘琛岄氫俊錛屽皢榪炴帴閫愭笎浠庢棫榪涚▼杞縐誨埌鏂拌繘紼嬨傝繖縐嶆柟寮忕殑浼樺娍鍦ㄤ簬鍙浠ヤ繚璇佹柊鏃т唬鐮佸畬鍏ㄩ殧紱伙紝浣嗛渶瑕侀濆栫殑榪涚▼闂撮氫俊鏈哄埗銆
鍙岃繘紼嬫ā寮忔槸鎸囧湪鏈嶅姟鍣ㄧ▼搴忎腑鍚屾椂鍚鍔ㄤ袱涓榪涚▼錛屽垎鍒澶勭悊榪炴帴鍜屾洿鏂般傛洿鏂版椂錛屽厛鍏抽棴鏃х殑榪炴帴榪涚▼錛岀劧鍚庡惎鍔ㄤ竴涓鏂扮殑榪涚▼鏉ュ勭悊鏂扮殑榪炴帴錛屾棫鐨勮繛鎺ヨ繘紼嬪畬鎴愬綋鍓嶈繛鎺ョ殑澶勭悊鍚庨鍑恆傝繖縐嶆柟寮忕殑浼樺娍鍦ㄤ簬鍙浠ュ厖鍒嗗埄鐢ㄥ氭牳澶勭悊鍣ㄧ殑鎬ц兘錛屽苟涓旀洿鏂拌繃紼嬪硅繛鎺ョ殑褰卞搷杈冨皬銆
闇瑕佹敞鎰忕殑鏄錛屼笉鍋滄満鏇存柊娑夊強鍒拌繛鎺ョ殑鍒囨崲鍜岃繘紼嬮棿閫氫俊絳夊嶆潅娓呮$殑鎿嶄綔寮婃f橈紝闇瑕佹牴鎹鍏蜂綋鐨勯渶奼傚拰鍦烘櫙榪涜岄夊瀷鍜屽疄鐜般傚悓鏃訛紝闇瑕佹敞鎰忓湪鏇存柊鏃跺勭悊濂借祫婧愮殑閲婃斁鍜屽姞杞斤紝閬垮厤璧勬簮娉勯湶鎴栧啿紿佺殑闂棰樸傚傛灉娌℃湁鐩稿叧緇忛獙鎴栬兘鍔涳紝寤鴻鍙傝冪浉鍏崇殑寮婧愭湇鍔″櫒妗嗘灦錛屽侼ginx絳夛紝鏉ュ疄鐜頒笉鍋滄満鏇存柊銆
㈢ 怎麼重新編譯android 下面的動態庫
使用動態庫來編譯動態庫
A項目的android.mk文件如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := testa
LOCAL_SRC_FILES := testa.c
include $(BUILD_SHARED_LIBRARY)
生成的libtesta.so加入到E:\workspace\android-ndk-r8e\platforms\android-8\arch-arm\usr\lib\下面
項目B的文件目錄結構如下:
jni
jni/jni/
jni/prebuilt/
jni目錄下的mk文件如下:
include $(all-subdir-makefiles)
jni/prebuilt目錄下的mk文件如下:
LOCAL_PATH := $(call my-dir)
#include $(CLEAR_VARS)
LOCAL_MODULE := libtesta
LOCAL_SRC_FILES := libtesta.so
include $(PREBUILT_SHARED_LIBRARY)
同時把libtesta.so也放入該目錄下.
jni/jni目錄下的mk文件內容:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_LDLIBS := -ltesta
LOCAL_MODULE := testb
LOCAL_SRC_FILES := testb.c
include $(BUILD_SHARED_LIBRARY)
這樣生成libtestb.so文件, 同時eclipse在打包時會把libtesta.so, libtestb.so都加入到apk文件中,如果沒有prebuilt那一步,那麼在打包時會漏掉libtesta.so, 但編譯會通過,因為編譯讀取的是編譯系統的庫文件目錄(LOCAL_LDLIBS := -ltesta), 這點需要注意
java代碼:
System.loadLibrary("testa");
System.loadLibrary("testb");
注意先後關系
㈣ linux 下如何將動態鏈接庫.so進行反編譯後,換編譯器重新編譯
程序能不能正常運行取決於程序和動態庫之間的ABI是否兼容。只要ABI兼容那麼編譯器版本就沒有影響。高版本的編譯器同樣可以使用低版本的ABI來生成目標代碼,但這個問題要具體分析。你解決問題的思路完全不對。
㈤ linux涓嬬殑緙栬瘧闂棰
linux涓嬬殑*.so涓鑸鏄涓涓絎﹀彿閾炬帴錛屾寚鍚戠湡姝g殑鍔ㄦ佸簱,濡*.so.1.3.4銆傝屽傛灉浣犳墍璇寸殑鏄榪欎釜鐪熸g殑鍔ㄦ佸簱琚淇鏀逛簡鐨勮瘽錛屽緩璁閲嶆柊緙栬瘧涓涓嬪簲鐢ㄧ▼搴忋傚洜涓轟笉鍚岀増鏈鐨勫簱鍙鑳芥帴鍙f湁鎵涓嶅悓銆傚傛灉浣犵敤閭d釜鍘熸潵鐨勫彲鎵ц屾枃浠訛紝涓嶄竴瀹氳兘澶熸e父榪愯屻
㈥ linux動態庫問題
1、雖然動態庫有點浪費內存,但是動態庫最大的作用是:減少佔用磁碟空間,減少開發時的編譯時間,而不是你想的編譯速度慢。因為採用了動態庫,所以如果我修改了動態庫,我只需要編譯動態庫。而如果採用了靜態庫,如果修改了靜態庫,那麼,所有用了該靜態庫的程序和靜態庫都必須重新編譯。而且gcc不是掃描整個libc.so文件。因為so文件里有符號表,哪個符號在哪個.o文件里,只要掃描符號表就知道了,而且由於他不需要從so文件中拷貝使用的函數,從某種意義上來說編譯速度比靜態庫更快。
2、動態庫的載入採用寫時拷貝技術,即:只有當我用這個函數的時候我才把該函數部分拷貝過來,它不會拷貝整個so文件,只會拷貝需要的部分。