㈠ VC程序調用動態庫,編譯時候也跟著編譯動態庫
不太清楚你的工程是如何建立的,想必一個工程是生成動態鏈接庫,另一個是調用程序EXE了。由於VC動態庫有兩種形式,Regular和Extended兩種,其中一種能導出類,另一種只能導出變數和函數。如果導出的是類,你在編譯EXE文件時自然需要用到類得聲明文件,即你前面所說的動態庫本身所引用的文件。如果導出的是函數或變數,有可能出現的情況是:一般為了代碼的重用性,把需要導出的函數或變數單獨放在一個頭文件中,用一個宏控制其導入、導出。編譯動態庫時,宏定義為導出,編譯EXE時,宏變為導入,這個頭文件為兩者共用。如果不小心在這個頭文件中包含了其他頭文件,也可能出現你說的情況。如果動態庫調用直接採用函數入口地址的方法,則什麼都不用聲明,當然,只適用於導出函數與變數的情形。
㈡ linux動態庫問題
1、雖然動態庫有點浪費內存,但是動態庫最大的作用是:減少佔用磁碟空間,減少開發時的編譯陪仔時間,而不是你想的編譯速度慢。因為採用了動態庫,所以如果我修改了動態庫,我只需要編譯動態庫。而如果採用了靜態庫,如果修改了靜態庫,那麼,所有用了該靜態庫的程序和靜態庫都必須重新編譯。而且gcc不是掃描整個libc.so文件。因為so文件里有符號表,哪個符號在哪個.o文件里,只要掃描符號表就知道了,而且由於他不需要從so文件中拷貝使用的函數,從某種意義上來說編譯速度比靜態庫更快。
2、動態庫的載入采拆亮用寫時拷貝技術,即:只有當我用這個函數的時候我才把該函數部分拷貝過來,蘆御汪它不會拷貝整個so文件,只會拷貝需要的部分。
㈢ 怎麼重新編譯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");
注意先後關系
㈣ android已有動態庫怎麼編譯靜態庫
在eclipse工程目錄下建立一空碼個jni的文件夾
在jni文件夾中建立Android.mk和Application.mk文件
Android.mk文件:
Android提供的一種makefile文件,用來指定諸如編譯生成so庫名、引用的頭文件目錄、需要編賣凱譯的.c/.cpp文件和.a靜態庫文件等。詳見附件中的Android.mk。
Application.mk文件:
定義了項目的一些細節,比如APP_ABI := x86(編譯X86平台庫)、APP_PLATFORM := android-9(使用android-9以上的平台庫)。
NDK 編譯和使用靜態庫、動態庫
情況一:編譯靜態庫
情況二:編譯動態庫
情況三:編譯動態庫+靜態庫
情況四:已有第三方靜態庫(動態庫),編譯靜態庫(動態庫)
默認所有代碼和文件在$project/jni下,否則特殊說明。
情況一:編譯靜態庫
文件Android.mk:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := hello-jni
LOCAL_SRC_FILES := hello-jni.c
include $(BUILD_STATIC_LIBRARY)
文件Application.mk:
APP_MODULES :=hello-jni
情況二:編譯動態庫
文件Android.mk:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := hello-jni
LOCAL_SRC_FILES := hello-jni.c
include $(BUILD_SHARED_LIBRARY)
情況三:編譯動態庫+靜態庫
文件Android.mk:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := mylib_static
LOCAL_SRC_FILES := src.c
include $(BUILD_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := mylib_shared
LOCAL_SRC_FILES := src2.c
LOCAL_STATIC_LIBRARIES := mylib_static
include $(BUILD_SHARED_LIBRARY)
情況四:已有第三方靜態庫(動態庫),編譯靜態庫(動態庫)
文件Android.mk:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := thirdlib1 # name it whatever
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libthird1.a # or $(so_path)/libthird1.so
#LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_STATIC_LIBRARY) #or PREBUILT_SHARED_LIBRARY
include $(CLEAR_VARS)
LOCAL_MODULE := mylib_use_thirdlib
LOCAL_SRC_FILES := src.c
LOCAL_STATIC_LIBRARIES := thirdlib1 #or LOCAL_SHARED_LIBRARY
include $(BUILD_SHARED_LIBRARY) #如果編譯靜態庫,需要Application.mk
用cd命令移至jni目錄,運行/mnt/500G/public/NDK/android-ndk-r7b/ndk-build命令,這時命令行中可能會出現編譯錯誤,比如頭文件找不到,函數找不到等等,細心找找就能改掉。
編譯成功後,在工中虧喚程目錄下libs/x86中就會生成你想要的.so庫。
㈤ 在redhat linux5.4里 替換動態庫後,編譯成功,但用ldd查看程序,顯示此庫找不到
呵呵友模,
1.將該路含告乎徑添加到/etc/ld.so.conf的談悉最後一行
2.ldconfig -v
應該就可以了。
㈥ qt動態庫編譯,是否只要聲明
qt動態庫編譯,是否只要聲明
這里的動態的意思汪耐應該是模塊代碼是動態載入的
而不是隨著應用程序一起編譯
只要動態庫里的函數介面不變
應用程序就無需重新編譯
只鍵橘需將動態庫重新編譯後替換掉舊的動態庫即可
如果動態庫的函數介面困亮春有變動
那麼應用程序就要重新編譯發布
這也是我的個人理解~~~
㈦ 動態庫怎麼編譯
# 聲稱動代連接庫模山銷,假設名唯輪稱為libtest.so gcc x.c y.c z.c -fPIC -shared -o libtest.so # 將main.c和動態連接庫進行連接生成可執行文件 gcc main.c -L. -ltest -o main # 輸出LD_LIBRARY_PATH環境變數,一邊動態庫裝載旦游器能夠找到需要的動態庫 e...
㈧ 依賴的dll更新後什麼情況下需要重新編譯主程序
有的網站後台代碼既有aspx又有CS文件,而且更改CS文件後不需要重新編譯,網站直接就改變了,是有好多這樣的網站。 主要的原因是:網站編譯,可以是整站編譯,也可以不編譯的。把所有源代碼,放在相應目錄,也是可以正常運行的,
㈨ 動態庫鏈接編譯
這里的動態的意思應該是模塊代碼是動態載入的
而不是隨著應用程序一起編譯
只要動態庫里的函數介面不變
應用程序就無需重新編譯
只需將動態庫重新編譯後替換掉舊的動態庫即可
如果動態庫的函數介面有變動
那麼應用程序就要重新編譯發布
這也是我的個人理解~~~
㈩ linux 下如何將動態鏈接庫.so進行反編譯後,換編譯器重新編譯
程序能不能正常運行取決於程序和動態庫之間的ABI是否兼容。只要ABI兼容那麼編譯器版本就沒有影響。高版本的編譯器同樣可以使用低版本的ABI來生成目標代碼,但這個問題要具體分析。你解決問題的思路完全不對。