當前位置:首頁 » 編程軟體 » 動態編譯庫

動態編譯庫

發布時間: 2023-05-13 06:39:15

① 怎麼重新編譯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

熱點內容
dropbear編譯 發布:2025-07-10 08:27:35 瀏覽:684
我的世界電腦建造伺服器推薦 發布:2025-07-10 08:13:08 瀏覽:401
如何提高存儲數據的速度 發布:2025-07-10 07:55:57 瀏覽:259
規范c語言代碼 發布:2025-07-10 07:55:57 瀏覽:516
在線砍價源碼 發布:2025-07-10 07:55:56 瀏覽:796
編程工作年限 發布:2025-07-10 07:44:42 瀏覽:143
vc壓縮文件夾 發布:2025-07-10 07:43:56 瀏覽:450
汽貿解壓 發布:2025-07-10 07:43:56 瀏覽:877
dreamweaver連接資料庫 發布:2025-07-10 07:43:55 瀏覽:742
三菱編程書籍 發布:2025-07-10 07:39:38 瀏覽:496