動態編譯庫
① 怎麼重新編譯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");
注意先後關系
② 編譯時找不到動態庫
報錯:
分析:
應該是動態庫鏈接的庫位置不對,默認在目錄usr/lib/ 下查找動態庫。
方式一 用ln -s建立創建軟連接,確保/usr/lib下存在庫。
ln -s /絕對路徑/源 /絕對路徑/目的
方式二 編譯時使用-rpath 或者-rpath-link,例如如下gcc編譯時設置
mips64el-redhat-linux-gcc -o test *.c -Wall -L./lib/mips64le/ -lpthread -lm -Wl,-rpath=/usr/local/gcc-4.8.3-d197-n64-loongson/usr/mips64el-redhat-linux/lib64/
掛載命令的順序
③ C#代碼編譯動態鏈接庫(DLL)
1.visual studio 新建-項目-類庫
2.一定要選.NET FrameWork
4.配置名字芹簡路徑
或者引用-添加引用
windows路徑:桐知
C:\Program Files\Unity\Hub\Editor<version-number>\Editor\Data\Managed\UnityEngine
macOS路局首消徑:
/Applications/Unity/Hub/Editor/<version-number>/Unity.app/Contents/Managed/UnityEngine
10.添加引用完成後【生成】/【重新生成】
11.生成後的文件在剛才選的路徑/默認路徑
④ linux編譯動態庫未定義main函數
Linux編譯動態庫時出現未定義main函數的問題,很可能是因為編譯器默認把森數敏源文件作為可執行程序進行編譯。一個畢槐解決方法是指定編譯參數-fPIC (position independent code),它使編譯器生成與位置無關的可重定位目標文件;另一種方法是在編譯時加上-lpthread參數以解決鏈接庫中使用到的線程庫未找到的問題。當然,還有其他可能導致該問題此枝的原因,比如代碼中使用的頭文件沒有正確包含等,需要進一步排查。
⑤ 動態庫會跟著程序編譯嗎
不會,動態庫是獨立的模塊,可以被多個程序共享。在編譯時,程序會鏈接動態庫,但不會跟著編譯,而是通過關聯模塊載入後再執行程序。因此,動態庫只需要編譯一次就可以被多個程慧喊序使用,效前告野率比靜態庫友弊更高。
⑥ Cmake動態編譯VTK庫(QVtkwidget)
在版本問題上大費周章之後,得到如下的成功嘗試
軟體版本說明:
PCl1.8.1 + VS2017 + Qt5.9.6 + Cmake + Vtk8.0.0
點擊Configure後對條目進行處理:(修改完成繼續Configure直到沒有錯誤)
1.點擊Add Entry添加
Name: CMAKE_DEBUG_POSTFIX 、Type: STRING 、Value:-gd、Description:空
讓vtk的lib最後分為debug版本跟release版本。Debug版本帶-gd。Release版本不帶-gd,方便區分.
2.勾選BUILD_SHARED_LIBS,這樣最後生成的vtk才會有dll跟lib
3.CMAKE_INSTALL_PREFIX設置為你清空的VTK文件夾(為了方便,這里選擇的路徑為PCL集成的VTK路徑)
4.勾選VTK_Group_Qt,這樣以後方便在qt裡面使用
5.修改Qt5_DIR路徑為PATH=D:/Qt/Qt5.12.0/5.12.0/msvc2017_64/lib/cmake/Qt5
6.修改VTK_QT_VERSION:STRING=5,使用Qt5修改相應版本號
7.如出現qmake路徑則修改QT_QMAKE_EXECUTABLE:FILEPATH=D:/Qt/Qt5.12.0/5.12.0/msvc2017_64/bin/qmake.exe
完成Configure,不出意外就不再顯示紅色,接著點Generate
接著以管理員身份運行VS2017,打開構建目錄下的VTK.sln
選擇Debug,x64,然後右鍵解決方案窗口的ALL_BUILD --> 生成。
漫長等待...ing
然後右鍵install --> 僅生成install
Release版本同理,先ALL_BUILD --> 生成 再 右鍵install --> 僅生成install
至此完成編譯VTK操作,接下來提取所需的QVtkwidget插件
⑦ 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...
⑨ 動態庫編譯詳解
當前類介紹:upper.c ( upper) 依賴於 bottom.c(play)
說明:當執行可執行程序的時候,需要去/lib. /user/lib下和LD_LIBRARY_PATH下尋找so.並不會在當前目錄下尋找.
所以執行./main.out會報錯.如下:
解決方案:指定.so運行搜尋路徑
1.-Wl,-rpath ./mypath 加入參數,並且將libplay.so 到./mypath目錄下.
2.設置LD_LIBRARY_PATH,指定目錄.
說明:指定了-Wl,-rpath, 設置LD_LIBRARY_PATH也是可以生效的.並不是說只會去-Wl,-rpath下尋找.
首先生成一個bottom.so,然後用upper.so去依賴bottom.so, 然後main.c 再去依賴upper.so.
說明:這里編譯的時候直接出錯,是因為沒有指定搜尋路徑,所以無法通過編譯.
解決編譯問題方案.
1.我們依然採用LD_LIBRARY_PATH的方式可以解決編譯和運行的問題.
2.生成libplay的時候,直接指定-Wl,-rpath 給libbottom.可以解決編譯不通過的問題.
3.依賴所有庫
依賴所有庫只能解決編譯問題,無法處理運行的路徑.
另一種思路:我們在執行main.out的時候 執行-Wl,-rpath.並不在生成libplay的時候指定,看下是否正常.
由此可見,-Wl,-rpath 只能針對直接依賴的libplay.so指定了路徑,但是libbottom還是無法查找到 .但是LD_LIBRARY是可以的.
rpath只能對直接依賴的so設置搜尋目錄,並且可以設置所有依賴的編譯路徑.
總結: 解決編譯問題,在生成libplay的時候指定-Wl,-rpath運行路徑,或者設置LD_LIBRARAY_PATH,都可以解決這個問題.
當我們現在擁有的so包含一個直接依賴的so和很多間接依賴的so,但是沒有設置rpath.所以是不能直接依賴主so進行編譯和運行的.
為了通過編譯:
1.在只鏈接主so的情況下可以去設置rpath或者LD_LIBRARY_PATH.
2.或者鏈接所有so.
為了通過運行:
為了正常運行可以設置LD_LIBRARY_PATH.
--disable-new-dtags,---dt-needed-entries
結論概述:
1.我們在生成間接依賴的庫的時候,為了保證其他庫可以直接依賴,需要加入-Wl,-rpath.保證編譯通過.
2.LD_LIBRARY_PATH可以解決一切編譯運行問題.
⑩ 為什麼動態編譯Qt庫需要Perl環境
您最初的想法是正確的,x86平台的庫放在電腦上即可。
而通過arm-linux-交叉編譯工具鏈編譯過的庫,是需要放在
開發板的文件系統裡面的,通用的做法一般是放在/lib或者/usr/lib
目錄裡面即可。或者也可放在其他目錄中,但是需要配置一下LD_LIBRARY_PATH
環境變數。例如放在/home/qtlib目錄中,由於這個不是系統默認的動態庫目錄,
需要設置環境變數LD_LIBRARY_PATH,在/etc/profile下面添加:
export LD_LIBRARY_PATH=/home/qtlib:$LD_LIBRARY_PATH