導航:首頁 > 源碼編譯 > 編譯動態庫怎麼知道加什麼lib

編譯動態庫怎麼知道加什麼lib

發布時間:2025-02-26 17:26:33

Ⅰ c++動態庫編寫

1.DLL的隱式調用
隱式鏈接採用靜態載入的方式,比較簡單,需要.h、.lib、.dll三件套。新建「控制台應用程序」或「空項目」。配置如下:
項目-屬性-配置屬性-VC++ 目錄- 在「包含目錄」里添加頭文件testdll.h所在的目錄
項目-屬性-配置屬性-VC++ 目錄- 在「庫目錄」里添加頭文件testdll.lib所在的目錄
項目-屬性-配置屬性-鏈接器-輸入- 在「附加依賴項」里添加「testdll.lib」(若有多個 lib 則以空格隔開) 。 //你也可以在代碼中添加一行設置庫的鏈接,#pragma comment(lib, "DLLSample.lib")
庫文件頭文件等目錄設置,本文將庫文件及頭文件拷貝到工程目錄下DLL文件夾
添加LIB依賴項
調用的源程序#
// callmyDLL.cpp : 定義控制台應用程序的入口點。
//包含頭頭文件,函數聲明
#include "stdafx.h"
#include "stdlib.h"
#include "myDLL.h"
int _tmain(int argc, _TCHAR* argv[])
{
//這是通過上節的extern方式調用的
int z= Add(1,2);
//也可以通過類導出的方式調用
//CmyDll dll;
//int z = dll.Add(1,2);
printf("z is:%d\n", z);
system("pause");
return 0;
}
以上如果包含目錄、庫目錄、庫的依賴項都沒有問題就可以生成成功了
#運行時最後一步:將動態庫文件拷貝到可執行文件目錄下,否則會出現如下錯誤。
如何沒有設置lib目錄和依賴項,可以在代碼中添加以下一行代碼也可以生成成功
// callmyDLL.cpp : 定義控制台應用程序的入口點。
//包含頭頭文件,函數聲明
#include "stdafx.h"
#include "stdlib.h"
#include "myDLL.h"
#prama comment(lib, "myDll.lib")
//此時的myDll.lib的路徑必須能找到的,可以給定一個全路徑如:「c:\\myDll.lib」
int _tmain(int argc, _TCHAR* argv[])
{
int z= Add(1,2);
printf("z is:%d\n", z);
system("pause");
return 0;
}
所以通過設置依賴項和庫目錄和添加#Prama是具有相同效果的,如果有問題,得檢查是否兩者的生成平台不同(如win32和x64)或者一個是Debug一個是release
2、DLL顯示調用
對於顯示連接,即動態載入我們需要調用LoadLibrary
在MSDN中:HMODULE WINAPI LoadLibrary(
__in LPCTSTR lpFileName
);
它的功能是映射一個可執行模塊到調用進程的地址空間。由此我們知道顯示調用就是函數指針來調用函數。
Steps:
1、聲明頭文件windows.h,說明我想用windows32方法來載入和卸載DLL
2、然後用typedef定義一個指針函數類型.typedef void(*fun) //這個指針類型,要和你調用的函數類型和參數保持一致
3、定一個句柄實例,用來取DLL的實例地址。HINSTANCE hdll;
格式為hdll=LoadLibrary(「DLL地址」);這里字元串類型是LPSTR,當是unicode字元集的時候會不行,
因此要在配置-屬性-常規裡面把默認字元集「unicode」改成支持多字元擴展即可。
4、取的地址要判斷,返回的句柄是否為空,如果為無效句柄,那麼要釋放載入DLL所佔用的內存。
5、定義一個函數指針,用來獲取你要用的函數地址。
然後通過GetProcAdress來獲取函數的地址,參數是DLL的句柄和你要調用的函數名:比如:FUN=(fun)GetProcAdress(hdll,"sum");
這里也要判斷要函數指針是否為空,如果沒取到要求的函數,那麼要釋放句柄。
6、然後通過函數指針來調用函數。
7、調用結束後,就釋放句柄FreeLibrary(hdll);
直接上代碼,一一一一一目瞭然
// callDLLSee.cpp : 定義控制台應用程序的入口點。
//通過調用windowsAPI 來載入和卸載DLL
#include "stdafx.h"
#include "Windows.h"
typedef int(*Dllfun)(int , int);
int _tmain(int argc, _TCHAR* argv[])
{
Dllfun funName;
HINSTANCE hdll;
//put DLL under the Debug path
//use _T 設置為寬字元
hdll = LoadLibrary( _T("myDLL.dll"));
if (hdll == NULL)
{
FreeLibrary(hdll);
}
funName = (Dllfun)GetProcAddress(hdll, "Add");
if (funName == NULL)
{
FreeLibrary(hdll);
}
int x = 1, y = 10;
double z= funName(r, h);
printf("z= %d\n", z);
FreeLibrary(hdll);
return 0;
}

Ⅱ (linux)動態鏈接庫找不到路徑

ld.so.conf只是在編譯時查找動態庫的路徑;

運行時動態庫的查找路徑默認在/usr/lib和/lib,所以找不到
可以設置LD_LIBRARY_PATH=/usr/local/ma(你動態庫的所在目錄)
或者把動態庫拷貝到/usr/lib或/lib下

Ⅲ 用arm-linux交叉編譯器使用動態庫時搜索標准路徑是什麼

你可以試著加--verbose選項,可以看到它的搜索路徑。
如果你有根文件系統,那麼通過指定--sysroot=dir,他會在默認的搜索路徑之前加上一個dir,在這些地方找;
還可以額外使用-Ldir來添加搜索路徑。

Ⅳ C++中lib 和 dll 的區別,生成以及使用詳解

首先介紹一下靜態庫(靜態鏈接庫)、動態庫(動態鏈接庫)的概念,首先兩者都是代碼共享的方式。
靜態庫:在鏈接步驟中,連接器將從庫文件取得所需的代碼,復制到生成的可執行文件中,這種庫稱為靜態庫,其特點是可執行文件中包含了庫代碼的一份完整拷貝;缺點就是被多次使用就會有多份冗餘拷貝。即靜態庫中的指令都全部被直接包含在最終生成的 EXE 文件中了。在vs中新建生成靜態庫的工程,編譯生成成功後,只產生一個.lib文件
動態庫:動態鏈接庫是一個包含可由多個程序同時使用的代碼和數據的庫,DLL不是可執行文件。動態鏈接提供了一種方法,使進程可以調用不屬於其可執行代碼的函數。函數的可執行代碼位於一個 DLL 中,該 DLL 包含一個或多個已被編譯、鏈接並與使用它們的進程分開存儲的函數。在vs中新建生成動態庫的工程,編譯成功後,產生一個.lib文件和一個.dll文件
那麼上述靜態庫和動態庫中的lib有什麼區別呢?
靜態庫中的lib:該LIB包含函數代碼本身(即包括函數的索引,也包括實現),在編譯時直接將代碼加入程序當中
動態庫中的lib:該LIB包含了函數所在的DLL文件和文件中函數位置的信息(索引),函數實現代碼由運行時載入在進程空間中的DLL提供
總之,lib是編譯時用到的,dll是運行時用到的。如果要完成源代碼的編譯,只需要lib;如果要使動態鏈接的程序運行起來,只需要dll。

Ⅳ 哪個命令可以查看.lib或.so文件

ldd 查看可執行文件鏈接了哪些 系統動態鏈接庫
nm 查看可執行文件裡面有哪些符號
strip 去除符號表可以給可執行文件瘦身
如果我們想從可執行程序裡面提取出來一點什麼文本信息的話,還可以用strings命令
strings

Linux操作系統上面的動態共享庫大致分為三類:
1、操作系統級別的共享庫和基礎的系統工具庫
比方說libc.so, libz.so, libpthread.so等等,這些系統庫會被放在/lib和/usr/lib目錄下面,如果是64位操作系統,還會有/lib64和/usr /lib64目錄。如果操作系統帶有圖形界面,那麼還會有/usr/X11R6/lib目錄,如果是64位操作系統,還有/usr/X11R6 /lib64目錄。此外還可能有其他特定Linux版本的系統庫目錄。
這些系統庫文件的完整和版本的正確,確保了Linux上面各種程序能夠正常的運行。
2、應用程序級別的系統共享庫
並非操作系統自帶,但是可能被很多應用程序所共享的庫,一般會被放在/usr/local/lib和/usr/local/lib64這兩個目錄下面。很多你自行編譯安裝的程序都會在編譯的時候自動把/usr/local/lib加入gcc的-L參數,而在運行的時候自動到/usr/local /lib下面去尋找共享庫。
以上兩類的動態共享庫,應用程序會自動尋找到他們,並不需要你額外的設置和擔心。這是為什麼呢?因為以上這些目錄默認就被加入到動態鏈接程序的搜索路徑裡面了。Linux的系統共享庫搜索路徑定義在/etc/ld.so.conf這個配置文件裡面。這個文件的內容格式大致如下:

/usr/X11R6/lib64
/usr/X11R6/lib
/usr/local/lib
/lib64
/lib
/usr/lib64
/usr/lib
/usr/local/lib64
/usr/local/ImageMagick/lib
假設我們自己編譯安裝的ImageMagick圖形庫在/usr/local/ImageMagick目錄下面,並且希望其他應用程序都可以使用 ImageMagick的動態共享庫,那麼我們只需要把/usr/local/ImageMagick/lib目錄加入/etc/ld.so.conf文件裡面,然後執行:ldconfig 命令即可。
ldcofig將搜索以上所有的目錄,為共享庫建立一個緩存文件/etc/ld.so.cache。為了確認ldconfig已經搜索到ImageMagick的庫,我們可以用上面介紹的strings命令從ld.so.cache裡面抽取文本信息來檢查一下:

strings /etc/ld.so.cache | grep ImageMagick

輸出結果為:

/usr/local/ImageMagick/lib/libWand.so.10
/usr/local/ImageMagick/lib/libWand.so
/usr/local/ImageMagick/lib/libMagick.so.10
/usr/local/ImageMagick/lib/libMagick.so
/usr/local/ImageMagick/lib/libMagick++.so.10
/usr/local/ImageMagick/lib/libMagick++.so
已經成功了!
3、應用程序獨享的動態共享庫
有很多共享庫只被特定的應用程序使用,那麼就沒有必要加入系統庫路徑,以免應用程序的共享庫之間發生版本沖突。因此Linux還可以通過設置環境變數LD_LIBRARY_PATH來臨時指定應用程序的共享庫搜索路徑,就像我們上面舉的那個例子一樣,我們可以在應用程序的啟動腳本裡面預先設置 LD_LIBRARY_PATH,指定本應用程序附加的共享庫搜索路徑,從而讓應用程序找到它。

Ⅵ linux 靜態庫和動態庫編譯的區別

Linux庫有動態與靜態兩種,動態通常用.so為後綴,靜態用.a為後綴。例如:libhello.so libhello.a
為了在同一系統中使用不同版本的庫,可以在庫文件名後加上版本號為後綴,例如: libhello.so.1.0,由於程序連接默認以.so為文件後綴名。所以為了使用這些庫,通常使用建立符號連接的方式。
ln -s libhello.so.1.0 libhello.so.1
ln -s libhello.so.1 libhello.so

動態庫和靜態庫的區別:
當要使用靜態的程序庫時,連接器會找出程序所需的函數,然後將它們拷貝到執行文件,由於這種拷貝是完整的,所以一旦連接成功,靜態程序庫也就不再需要了。然而,對動態庫而言,就不是這樣。動態庫會在執行程序內留下一個標記『指明當程序執行時,首先必須載入這個庫。由於動態庫節省空間,linux下進行連接的預設操作是首先連接動態庫,也就是說,如果同時存在靜態和動態庫,不特別指定的話,將與動態庫相連接。

兩種庫的編譯產生方法:
第一步要把源代碼編繹成目標代碼。以下面的代碼hello.c為例,生成hello庫:

/* hello.c */
#include
void sayhello()
{
printf("hello,world\n");
}
用gcc編繹該文件,在編繹時可以使用任何全法的編繹參數,例如-g加入調試代碼等:
gcc -c hello.c -o hello.o
1.連接成靜態庫
連接成靜態庫使用ar命令,其實ar是archive的意思
$ar cqs libhello.a hello.o
2.連接成動態庫
生成動態庫用gcc來完成,由於可能存在多個版本,因此通常指定版本號:
$gcc -shared -Wl,-soname,libhello.so.1 -o libhello.so.1.0 hello.o
另外再建立兩個符號連接:
$ln -s libhello.so.1.0 libhello.so.1
$ln -s libhello.so.1 libhello.so
這樣一個libhello的動態連接庫就生成了。最重要的是傳gcc -shared 參數使其生成是動態庫而不是普通執行程序。
-Wl 表示後面的參數也就是-soname,libhello.so.1直接傳給連接器ld進行處理。實際上,每一個庫都有一個soname,當連接器發現它正在查找的程序庫中有這樣一個名稱,連接器便會將soname嵌入連結中的二進制文件內,而不是它正在運行的實際文件名,在程序執行期間,程序會查找擁有 soname名字的文件,%B

閱讀全文

與編譯動態庫怎麼知道加什麼lib相關的資料

熱點內容
javascript權威編程指南 瀏覽:334
pdf機長 瀏覽:378
五十音圖pdf 瀏覽:865
什麼叫下架伺服器 瀏覽:111
pdf解析度查看 瀏覽:15
如何將word轉pdf 瀏覽:186
我的世界ec伺服器怎麼調配置 瀏覽:259
單片機換標 瀏覽:595
語音系統和方舟編譯器哪個好 瀏覽:316
html用什麼編譯器顯示 瀏覽:185
程序員列印系統 瀏覽:73
安裝系統埠和伺服器地址怎麼看 瀏覽:263
編譯指針 瀏覽:410
用於解壓房款的擔保協議 瀏覽:674
程序員補班 瀏覽:566
組件編譯語言 瀏覽:817
c文件夾怎麼復制 瀏覽:968
linux統計ip流量 瀏覽:999
905減407的豎式演算法 瀏覽:648
我的世界網易版如何查看伺服器種子 瀏覽:633