动态库替换后需要重新编译吗
㈠ 动态库链接编译
这里的动态的意思应该是模块代码是动态加载的
而不是随着应用程序一起编译
只要动态库里的函数接口不变
应用程序就无需重新编译
只需将动态库重新编译后替换掉旧的动态库即可
如果动态库的函数接口有变动
那么应用程序就要重新编译发布
这也是我的个人理解~~~
㈡ 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文件,只会拷贝需要的部分。