1. 程式人生 > >動態連結庫的編寫和使用詳解

動態連結庫的編寫和使用詳解

作者:zieckey([email protected])
All Rights Reserved!

首先說下DLL的原理.
自從微軟推出第一個版本的Windows作業系統以來,
動態連結庫(DLL)一直是Windows作業系統的基礎。
動態連結庫通常都不能直接執行,也不能接收訊息。
它們是一些獨立的檔案,其中包含能被可執行程式或其它DLL呼叫來完成某項工作的函式。
只有在其它模組呼叫動態連結庫中的函式時,它才發揮作用。
Windows API中的所有函式都包含在DLL中。
其中有3個最重要的DLL,
Kernel32.dll,它包含用於管理記憶體、程序和執行緒的各個函式;
User32.dll,它包含用於執行使用者介面任務(如視窗的建立和訊息的傳送)的各個函式;
GDI32.dll,它包含用於畫圖和顯示文字的各個函式。


靜態庫:函式和資料被編譯進一個二進位制檔案(通常副檔名為.LIB)。
在使用靜態庫的情況下,在編譯連結可執行檔案時,
連結器從庫中複製這些函式和資料並把它們和應用程式的其它模組組合起來建立最終的可執行檔案(.EXE檔案)。
在使用動態庫的時候,往往提供兩個檔案:一個引入庫和一個DLL。
引入庫包含被DLL匯出的函式和變數的符號名,DLL包含實際的函式和資料。
在編譯連結可執行檔案時,只需要連結引入庫,DLL中的函式程式碼和資料並不複製到可執行檔案中,
在執行的時候,再去載入DLL,訪問DLL中匯出的函式。

使用動態連結庫的好處:
可以採用多種程式語言來編寫。
增強產品的功能。
提供二次開發的平臺。
簡化專案管理。
可以節省磁碟空間和記憶體。
有助於資源的共享。
有助於實現應用程式的本地化。

動態連結庫載入的兩種方式:隱式連結,顯示載入


新建一個空的dll工程,然後建立一個dll1.cpp檔案如下
int  add(int a,int b)
{
 return a+b;
}

int  subtract(int a,int b)
{
 return a-b;
}

編譯之後,我們看看匯出函式
E:/zieckey/CPP-study/Dll1/Debug>dumpbin -exports dll1.dll
Microsoft (R) COFF Binary File Dumper Version 6.00.8168
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.


Dump of file dll1.dll

File Type DLL

  Summary

        7000 .data
        1000 .idata
        2000 .rdata
        2000 .reloc
       2A000 .text
這裡沒有任何匯出函式,那麼我們可以這樣,更改原始檔
_declspec(dllexport) int  add(int a,int b)
{
 return a+b;
}

_declspec(dllexport) int  subtract(int a,int b)
{
 return a-b;
}

編譯之後再去看看

E:/zieckey/CPP-study/Dll1/Debug>dumpbin -exports dll1.dll
Microsoft (R) COFF Binary File Dumper Version 6.00.8168
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.


Dump of file dll1.dll

File Type DLL

  Section contains the following exports for Dll1.dll

           0 characteristics
    456BD6E2 time date stamp Tue Nov 28 142746 2006
        0.00 version
           1 ordinal base
           2 number of functions
           2 number of names

    ordinal hint RVA      name

  Summary

        7000 .data
        1000 .idata
        3000 .rdata
        2000 .reloc
       2A000 .text

好了,這次我們看到了兩個我們自己下的函式名字,只是名字似乎被更改過了,這是VC為了函式過載的方便,它以自己的規則修改了我們的源程式的函式名字.
下面我們來測試下剛剛建立的dll1.dll動態連結庫.
我們新建一個win32控制檯的空工程,新建一個dlltest.cpp ,下面是它的原始碼
#include iostream.h
extern int add(int,int);   宣告這個函式在外部定義
extern int subtract(int,int);
void main(void)
{
 cout3+5 = add(3,5)endl;
 cout5-3 = subtract(5,3)endl;
}
編譯一下
Compiling...
dlltest.cpp
Linking...
dlltest.obj  error LNK2001 unresolved external symbol int __cdecl substract(int,int) ([email protected]@[email protected])
dlltest.obj  error LNK2001 unresolved external symbol int __cdecl add(int,int) ([email protected]@[email protected])
DebugDllTest.exe  fatal error LNK1120 2 unresolved externals
執行 link.exe 時出錯.
DllTest.exe - 1 error(s), 0 warning(s)

可以發現是在連線的時候出錯了,則說明編譯是沒有錯,編譯器找到了這兩個函式,因為這兩個函式已經聲明瞭.
但是在連線的時候沒有找到.我們可以這樣做;
將剛剛生成動態連結庫檔案的同一目錄下,找到dll1.lib輸入庫檔案,拷貝到我們的工程目錄下,
最後 Project-Settings  在Link選項卡找到Objectlibrary modules  在最後填入 dll1.lib 。
如果原來就有連結,請使用空格分隔。

好的我們再編譯下
--------------------Configuration DllTest - Win32 Debug--------------------
DllTest.exe - 0 error(s), 0 warning(s)
沒有錯誤,執行時又出現錯誤,哦,我們的程式在執行時沒有找到dll1.dll這個檔案,好說,將它也拷貝到當前工程的目錄下.
再執行,ye,這次就好了,輸出資訊如下
3+5 = 8
5-3 = 2
Press any key to continue

我們可以檢視以檢視一下這個可執行程式的輸入資訊
E:/zieckey/CPP-study/DllTest/Debug>dumpbin -imports DllTest.exe
Microsoft (R) COFF Binary File Dumper Version 6.00.8168
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.


Dump of file DllTest.exe

File Type EXECUTABLE IMAGE

  Section contains the following imports

    Dll1.dll
                43019C Import Address Table
                43003C Import Name Table
                     0 time date stamp
                     0 Index of first forwarder reference

    KERNEL32.dll
                4301D0 Import Address Table
                430070 Import Name Table
                     0 time date stamp
                     0 Index of first forwarder reference

                  CA  GetCommandLineA
                 174  GetVersion
                  7D  ExitProcess
                 22F  RtlUnwind
                 11A  GetLastError
                  1B  CloseHandle
                 2DF  WriteFile
                 218  ReadFile
                 26A  SetFilePointer
                 26D  SetHandleCount
                 152  GetStdHandle
                 115  GetFileType
                 150  GetStartupInfoA
                  51  DebugBreak
                 1AD  InterlockedDecrement
                 1F5  OutputDebugStringA
                 13E  GetProcAddress
                 1C2  LoadLibraryA
                 1B0  InterlockedIncrement
                 124  GetModuleFileNameA
                 29E  TerminateProcess
                  F7  GetCurrentProcess
                 2AD  UnhandledExceptionFilter
                  B2  FreeEnvironmentStringsA
                  B3  FreeEnvironmentStringsW
                 2D2  WideCharToMultiByte
                 106  GetEnvironmentStrings
                 108  GetEnvironmentStringsW
                 126  GetModuleHandleA
                 109  GetEnvironmentVariableA
                 175  GetVersionExA
                 19D  HeapDestroy
                 19B  HeapCreate
                 19F  HeapFree
                 2BF  VirtualFree
                  AA  FlushFileBuffers
                 1B8  IsBadWritePtr
                 1B5  IsBadReadPtr
                 1A7  HeapValidate
                 27C  SetStdHandle
                 241  SetConsoleCtrlHandler
                  BF  GetCPInfo
                  B9  GetACP
                 131  GetOEMCP
                 199  HeapAlloc
                 2BB  VirtualAlloc
                 1A2  HeapReAlloc
                 28B  SetUnhandledExceptionFilter
                 1B2  IsBadCodePtr
                 1E4  MultiByteToWideChar
                 1BF  LCMapStringA
                 1C0  LCMapStringW
                 153  GetStringTypeA
                 156  GetStringTypeW

  Summary

        6000 .data
        1000 .idata
        2000 .rdata
        2000 .reloc
       27000 .text

另外我們可以通過VC提供的圖形化工具檢視我們的可執行程式依賴的動態連結庫檔案,
在VC的安裝目錄下的 DSoftwaresMicrosoft Visual StudioVC98Microsoft Visual C++ 6.0 Tools 目錄下有這個工具 Depends .
它可以檢視可執行程式依賴的動態連結庫檔案

我們還可以這樣宣告動態連結庫裡的函式介面,原始碼修改為
#include iostream.h
extern int add(int,int);
extern int subtract(int,int);
_declspec(dllimport) int add(int,int);
_declspec(dllimport) int subtract(int,int);
void main(void)
{
 cout3+5 = add(3,5)endl;
 cout5-3 = subtract(5,3)endl;
}
編譯執行.
_declspec(dllimport) 就告訴編譯器這個函式是從動態連結庫的.lib檔案中輸入的,編譯器就能生成執行效率更高的程式碼.

我們可以把我們自己做的動態連結庫檔案的函式宣告都放到一個頭檔案中,以便告訴使用者這個動態連結庫檔案裡封裝的函式原型.
好的我們在前面動態連結庫的工程中新增一個頭檔案 dll1.h ,其裡面的內容是
_declspec(dllimport) int add(int,int);
_declspec(dllimport) int subtract(int,int);

那麼現在我們就可以將原始碼修改為
#include iostream.h
extern int add(int,int);
extern int subtract(int,int);
#include ..Dll1dll1.h
void main(void)
{
 cout3+5 = add(3,5)endl;
 cout5-3 = subtract(5,3)endl;
}
編譯執行.

我們到這裡可以發現,前面的動態連結庫原始碼檔案dll1.cpp
_declspec(dllexport) int  add(int a,int b)
{
 return a+b;
}
_declspec(dllexport) int  subtract(int a,int b)
{
 return a-b;
}
這裡是匯出形式(dllexport),那麼這個動態連結庫就不能被它自己的原始碼程式呼叫,這時我們可以改改就行了
dll1.cpp
#define DLL1_API _declspec(dllexport)
#include dll1.h
int  add(int a,int b)
{
 return a+b;
}
int  subtract(int a,int b)
{
 return a-b;
}


dll1.h
#ifdef DLL1_API
#else
#define DLL1_API _declspec(dllimport)
#endif
DLL1_API int add(int,int);
DLL1_API int subtract(int,int);


現在這個dll庫就可以被自己呼叫也可以被其他程式呼叫了.
我們再看看怎麼將類匯出,象這樣就好了
#ifdef DLL1_API
#else
#define DLL1_API _declspec(dllimport)
#endif
DLL1_API int add(int,int);
DLL1_API int subtract(int,int);
class DLL1_API Point
{
public
 void output( int x,int y);
};

如果我們不想將整個類都匯出,我們只需將類的部分公有成員函式匯出,
我們可以這樣做
#ifdef DLL1_API
#else
#define DLL1_API _declspec(dllimport)
#endif
DLL1_API int add(int,int);
DLL1_API int subtract(int,int);
class DLL1_API Point
{
public
 DLL1_API void output( int x,int y);
 void test();
};
這裡的void test();是做一個對比用的.
我們用dumpbin -exports dll1.dll看看匯出情況
E:/zieckey/CPP-study/Dll1/Debug>dumpbin -exports dll1.dll
Microsoft (R) COFF Binary File Dumper Version 6.00.8168
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.


Dump of file dll1.dll

File Type DLL

  Section contains the following exports for Dll1.dll

           0 characteristics
    456BE737 time date stamp Tue Nov 28 153727 2006
        0.00 version
           1 ordinal base
           3 number of functions
           3 number of names

    ordinal hint RVA      name

  Summary

        7000 .data
        1000 .idata
        3000 .rdata
        2000 .reloc
       31000 .text


上面提到了VC++編譯器將函式名字進行了改寫,這對於其他編譯器來說也許就不是什麼好事,因為其他編譯器很可能找不到匯出的函式,
因為名字已經被改動了.那麼我們就希望這個名字不要更改.這裡可以加上 extern C 標識
dll1.cpp
#define DLL1_API extern C _declspec(dllexport)
#include dll1.h
int  add(int a,int b)
{
 return a+b;
}
int  subtract(int a,int b)
{
 return a-b;
}

dll1.h
#ifdef DLL1_API
#else
#define DLL1_API extern C _declspec(dllimport)
#endif
DLL1_API int add(int,int);
DLL1_API int subtract(int,int);
編譯下,看看匯出情況,
E:/zieckey/CPP-study/Dll1/Debug>dumpbin -exports dll1.dll
Microsoft (R) COFF Binary File Dumper Version 6.00.8168
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.


Dump of file dll1.dll

File Type DLL

  Section contains the following exports for Dll1.dll

           0 characteristics
    456BE969 time date stamp Tue Nov 28 154649 2006
        0.00 version
           1 ordinal base
           2 number of functions
           2 number of names

    ordinal hint RVA      name

          1    0 0000100A add
          2    1 00001005 subtract

  Summary

        7000 .data
        1000 .idata
        3000 .rdata
        2000 .reloc
       2A000 .text

這裡就可以看到名字沒有改變,
但是用 extern C 標識也有缺陷,就是它只能表示全域性函式,
而對於類說,它不能匯出類的成員函式.
如果呼叫約定被改變了的話,即使加了 extern C 標識,函式名還是會被改變
這裡我們舉例看看
dll1.cpp
#define DLL1_API extern C _declspec(dllexport)
#include dll1.h
int _stdcall  add(int a,int b)
{
 return a+b;
}
int _stdcall  subtract(int a,int b)
{
 return a-b;
}

dll1.h
#ifdef DLL1_API
#else
#define DLL1_API extern C _declspec(dllimport)
#endif
DLL1_API int _stdcall add(int,int);
DLL1_API int _stdcall subtract(int,int);
編譯下,看看匯出情況
E:/zieckey/CPP-study/Dll1/Debug>dumpbin -exports dll1.dll
Microsoft (R) COFF Binary File Dumper Version 6.00.8168
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.


Dump of file dll1.dll

File Type DLL

  Section contains the following exports for Dll1.dll

           0 characteristics
    456BEBDB time date stamp Tue Nov 28 155715 2006
        0.00 version
           1 ordinal base
           2 number of functions
           2 number of names

    ordinal hint RVA      name

  Summary

        7000 .data
        1000 .idata
        3000 .rdata
        2000 .reloc
       2A000 .text
這裡就可以看到名字還是發生了改變,
[email protected]這裡的8表示add函式的引數所佔位元組數.
我們看看下面的解決方法.

再重新新建一個dll的空工程,命名為Dll2      
再新建一個C++原始檔,命名為dll2.cpp,
dll2.cpp
int add(int a,int b)
{
 return a+b;
}
int subtract(int a,int b)
{
 return a-b;
}

然後我們建立一個模組定義檔案,命名為dll2.def,然後新增我們的工程中.其內容如下

LIBRARY Dll2

EXPORTS
add
subtract

其中 LIBRARY Dll2 這個名字一定要與我們的工程名字匹配,另外這句話也不是必須的.
EXPORTS表明動態連結庫中要匯出的函式名字,我們可以在 MSDN 中檢視一下它的用法.

編譯一下,看看匯出情況
E:/zieckey/CPP-study/Dll2/Debug>dumpbin -exports dll2.dll
Microsoft (R) COFF Binary File Dumper Version 6.00.8168
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.


Dump of file dll2.dll

File Type DLL

  Section contains the following exports for Dll2.dll

           0 characteristics
    456BEECE time date stamp Tue Nov 28 160950 2006
        0.00 version
           1 ordinal base
           2 number of functions
           2 number of names

    ordinal hint RVA      name

          1    0 0000100A add
          2    1 00001005 subtract

  Summary

        7000 .data
        1000 .idata
        3000 .rdata
        2000 .reloc
       2A000 .text
      
這裡就可以看到名字沒有改變,和原來的一樣.


上面我們都是用隱式連結的方式呼叫動態連結庫的,
下面我們看看另一種方法,顯示呼叫
將我們的 DllTest 工程中的 Project-Settings 
在Link選項卡中的 Objectlibrary modules 刪除 dll1.lib

這裡就要用到一個函式
HINSTANCE LoadLibrary
(
  LPCTSTR lpLibFileName    address of filename of executable module
);
它是對映指定的模組到應用程序的地址空間

獲得函式的地址空間用如下函式,
FARPROC GetProcAddress(
  HMODULE hModule,     handle to DLL module
  LPCSTR lpProcName    name of function
);

好的,現在我們看看我們的測試程式怎麼寫,將測試工程中的 dlltest.cpp 檔案改為如下

dlltest.cpp
#include iostream.h
#include windows.h
void main(void)
{
 HINSTANCE hInst;
 hInst=LoadLibrary(Dll2.dll);
 typedef int (FUNCPROC)(int a,int b);
 FUNCPROC ADD=(FUNCPROC)GetProcAddress(hInst,add);
 FUNCPROC SUB=(FUNCPROC)GetProcAddress(hInst,subtract);
 if(!ADD)
 {
  cout獲取函式地址失敗!endl;
  return;
 }
 cout3+5 = ADD(3,5)endl;
 cout5-3 = SUB(5,3)endl;
 FreeLibrary(hInst);  釋放動態連結庫 
}

編譯執行,哦,別忘了將我們新編譯處理的dll檔案 dll2.dll 複製到我們的測試程式工程目錄下.
執行結果如下
3+5 = 8
5-3 = 2
Press any key to continue

這裡我們可以發現我們只拷貝了一個 dll2.dll 檔案,
而沒有拷貝我們的 dll2.lib ,這裡是因為我們是動態載入的.
動態載入的好處是在我們需要的地方載入,這樣可以節約記憶體空間.
如果是用隱式連結的方式,那麼在我們啟動程式時,多個dll庫都要載入到記憶體中,
這時很浪費記憶體的,而且程式啟動時間也很慢.

我們再來看看改變呼叫的方式,將dll2.cpp檔案改變如下
dll2.cpp
int add(int a,int b)
{
 return a+b;
}
int subtract(int a,int b)
{
 return a-b;
}

編譯一下,看看匯出情況
E:/zieckey/CPP-study/Dll2/Debug>dumpbin -exports dll2.dll
Microsoft (R) COFF Binary File Dumper Version 6.00.8168
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.


Dump of file dll2.dll

File Type DLL

  Section contains the following exports for Dll2.dll

           0 characteristics
    456BF57D time date stamp Tue Nov 28 163821 2006
        0.00 version
           1 ordinal base
           2 number of functions
           2 number of names

    ordinal hint RVA      name

          1    0 0000100A add
          2    1 00001005 subtract

  Summary

        7000 .data
        1000 .idata
        3000 .rdata
        2000 .reloc
       2A000 .text
這裡就可以看到即使改變了呼叫方式,函式名字沒有改變,和原來的一樣.
好的,那麼我們來看看測試程式,
當然,別忘了將我們新編譯處理的dll檔案 dll2.dll 複製到我們的測試程式工程目錄下.
編譯,沒有錯誤,在執行時出現了錯誤,這是因為我們改變了呼叫的約定,
當然,在呼叫的時候也要遵循這樣的約定,將測試工程中的 dlltest.cpp 檔案改為如下

dlltest.cpp
#include iostream.h
#include windows.h
void main(void)
{
 HINSTANCE hInst;
 hInst=LoadLibrary(Dll2.dll);
 typedef int (_stdcall FUNCPROC)(int a,int b);
 FUNCPROC ADD=(FUNCPROC)GetProcAddress(hInst,add);
 FUNCPROC SUB=(FUNCPROC)GetProcAddress(hInst,subtract);
 if(!ADD)
 {
  cout獲取函式地址失敗!endl;
  return;
 }
 cout3+5 = ADD(3,5)endl;
 cout5-3 = SUB(5,3)endl;
 FreeLibrary(hInst);  釋放動態連結庫 
}
好了這樣就行了.
我們再來看看現在編譯出來的可執行程式 dlltest.exe 的匯入資訊.
E:/zieckey/CPP-study/DllTest/Debug>dumpbin -imports DllTest.exe
Microsoft (R) COFF Binary File Dumper Version 6.00.8168
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.


Dump of file DllTest.exe

File Type EXECUTABLE IMAGE

  Section contains the following imports

    KERNEL32.dll
                43015C Import Address Table
                430028 Import Name Table
                     0 time date stamp
                     0 Index of first forwarder reference

                  B4  FreeLibrary
                 13E  GetProcAddress
                 1C2  LoadLibraryA
                  CA  GetCommandLineA
                 174  GetVersion
                  7D  ExitProcess
                 22F  RtlUnwind
                 11A  GetLastError
                  1B  CloseHandle
                 2DF  WriteFile
                 218  ReadFile
                 26A  SetFilePointer
                 26D  SetHandleCount
                 152  GetStdHandle
                 115  GetFileType
                 150  GetStartupInfoA
                  51  DebugBreak
                 1AD  InterlockedDecrement
                 1F5  OutputDebugStringA
                 1B0  InterlockedIncrement
                 124  GetModuleFileNameA
                 29E  TerminateProcess
                  F7  GetCurrentProcess
                 2AD  UnhandledExceptionFilter
                  B2  FreeEnvironmentStringsA
                  B3  FreeEnvironmentStringsW
                 2D2  WideCharToMultiByte
                 106  GetEnvironmentStrings
                 108  GetEnvironmentStringsW
                 126  GetModuleHandleA
                 109  GetEnvironmentVariableA
                 175  GetVersionExA
                 19D  HeapDestroy
                 19B  HeapCreate
                 19F  HeapFree
                 2BF  VirtualFree
                  AA  FlushFileBuffers
                 1B8  IsBadWritePtr
                 1B5  IsBadReadPtr
                 1A7  HeapValidate
                 27C  SetStdHandle
                 241  SetConsoleCtrlHandler
                  BF  GetCPInfo
                  B9  GetACP
                 131  GetOEMCP
                 199  HeapAlloc
                 2BB  VirtualAlloc
                 1A2  HeapReAlloc
                 28B  SetUnhandledExceptionFilter
                 1B2  IsBadCodePtr
                 1E4  MultiByteToWideChar
                 1BF  LCMapStringA
                 1C0  LCMapStringW
                 153  GetStringTypeA
                 156  GetStringTypeW

  Summary

        6000 .data
        1000 .idata
        2000 .rdata
        2000 .reloc
       27000 .text
      
這裡就看不到我們的 dll2.dll 的資訊了.因為我們時動態載入

我們看到dll2.dll庫的資訊有如下
          1    0 0000100A add
          2    1 00001005 subtract
我們可以通過序號呼叫這兩個函式,這裡我們用到了 MAKEINTRESOURCE     
將測試工程中的 dlltest.cpp 檔案改為如下

dlltest.cpp
#include iostream.h
#include windows.h
void main(void)
{
 HINSTANCE hInst;
 hInst=LoadLibrary(Dll2.dll);
 typedef int (_stdcall FUNCPROC)(int a,int b);
 FUNCPROC ADD=(FUNCPROC)GetProcAddress(hInst,MAKEINTRESOURCE(1));
 FUNCPROC SUB=(FUNCPROC)GetProcAddress(hInst,MAKEINTRESOURCE(2));
 if(!ADD)
 {
  cout獲取函式地址失敗!endl;
  return;
 }
 cout3+5 = ADD(3,5)endl;
 cout5-3 = SUB(5,3)endl;
 FreeLibrary(hInst);  釋放動態連結庫 
}
好了這樣就行了. 
但是我們應該通過函式名來呼叫dll庫中的函式.
因為這個讓程式可讀性更好,出錯機率也小些

對於動態連結庫的可選程式入口點時 DllMain
BOOL WINAPI DllMain(
  HINSTANCE hinstDLL,   handle to DLL module
  DWORD fdwReason,      reason for calling function
  LPVOID lpvReserved    reserved
);

這裡我們看到通過模組化生成動態連結庫是比較好的選擇.


一點小技巧:
VC的bin目錄下的 VCVARS32.BAT 批處理程式就是建立VC的開發環境的.
在命令提示符下的貼上和拷貝
貼上:點選滑鼠右鍵貼上就可以了
複製:點選滑鼠右鍵選擇標記,然後用滑鼠左鍵標記一段,單擊滑鼠左鍵,那麼就將相應內容複製到剪貼簿下了.



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1418653

 

相關推薦

c#(winform)環境下使用動態連結dll的

  1,什麼是dll檔案? DLL(Dynamic Link Library)檔案為動態連結庫檔案,又稱“應用程式拓展”,是軟體檔案型別。在Windows中,許多應用程式並不是一個完整的可執行檔案,它們被分割成一些相對獨立的動態連結庫,

動態連結dll靜態連線lib的區別

          由於專業原因,一直沒有系統的學習過c++。最近在學習opencv,而opencv的配置對於程式設計經驗不豐富的人來說理解起來還是需要一個過程的。opencv配置的設定涉及到兩個很重要的概念:dll和lib。          首先什麼是dll和lib?

動態連結編寫使用

作者:zieckey([email protected])All Rights Reserved! 首先說下DLL的原理.自從微軟推出第一個版本的Windows作業系統以來,動態連結庫(DLL)一直是Windows作業系統的基礎。動態連結庫通常都不能直接執行,也不能

java中呼叫本地動態連結(*.DLL)的兩種方式not found library、打包成jar,war包dll無法載入等等問題解決辦法

我們經常會遇到需要java呼叫c++的案例,這裡就java呼叫DLL本地動態連結庫兩種方式,和載入過程中遇到的問題進行詳細介紹 1、通過System.loadLibrary("dll名稱,不需要字尾名

Linux下使用QT編寫呼叫動態連結(.so檔案)

Linux下Qt建立和呼叫共享庫檔案.so 費了點功夫,總算get了編寫共享庫(Shared Library,Windows下稱為“動態連結庫”,即Dynamic Link Library)和呼叫的這個新技能! 動態連結庫的好處是不言而喻的,一個稍微複雜一點的程式,頂層設計的時候良好

linux連結動態/靜態)的使用

ref:http://niefei.blog.ccidnet.com/blog/ccid/do_showone/tid_42855.html1. 介紹  使用GNU的工具我們如何在Linux下建立自己的程式函式庫?一個“程式 函式庫”簡單的說就是一個檔案包含了一些編譯好的程式碼和資料,這些編 譯好的程式碼和資

C#呼叫C/C++動態連結(.dll)

第一篇編譯C的動態連線庫 在實際工作中,我們經常會將C語言中的.lib和.h檔案(靜態庫)編譯成動態連線庫.dll檔案(這裡只提供這兩種檔案,沒有完整的工程),以提供給其他語言平臺呼叫。 1,必須有.lib檔案,只有.h檔案是無法編譯動態連線庫的。 2,我使用的是V

MFC動態連結呼叫

MFC動態連結庫的呼叫,有好多種方式,這裡只介紹一種簡單的呼叫的方式,只需要把動態連結庫編譯後的.dll檔案放到呼叫介面的Debug下面。再在介面需要呼叫動態連結庫裡新增相關函式就行了。找了好多資料,發現沒有詳細的介紹,下面就是從動態連結庫建立開始,一點點詳細的

C#編寫呼叫動態連結

3705.288--dll檔案是你伺服器端指令碼編譯後生成的元件,也就是說一但編譯成dll後,軟體發行後,你對應頁面的伺服器端指令碼檔案.aspx.cs就不需要釋出了,因為程式碼已經封裝在工程名.dll檔案裡了.而.pdb檔案據我理解,可能是帶上了一些資源類的檔案吧,所以檔案要比相應的dll檔案大,至於你說的

用VC++ 6.0編寫使用動態連結

一、編寫動態連結庫 首先利用VC++新建一個Win32 Dynamic-Link Library型別的工程,工程取名為:Dll1,並在AppWizard的第一步選擇“An empty Dll project”選項,即建立一個空的動態連結庫工程。然後為工程新增一個C++原始檔

HDU acm 1003 Max Sum || 動態規劃求最大子序列

line namespace num more sequence mem ould 動態規劃 ger Max Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Ot

Net Core中數據事務隔離——以DapperMysql為例

事務 ring 增刪改 tostring 測試 stc efault 多個 log Net Core中數據庫事務隔離詳解——以Dapper和Mysql為例 事務隔離級別 準備工作 Read uncommitted 讀未提交 Read committed 讀取提交內

靜態連結的編譯與使用 linux下的動態連結靜態連結到底是個什麼鬼?(一)靜態連結的編譯與使用

linux下的動態連結庫和靜態連結庫到底是個什麼鬼?(一)靜態連結庫的編譯與使用       知識不等於技術,這句話真的是越工作的時間長越深有體會,學習到的知識只有不斷的實踐,才成真正在自已的心裡紮下根,成為自身的一部分,所以無論如何,我希望我的部落格可以

GCC編譯過程與動態連結靜態連結(未整理)

來源:https://www.cnblogs.com/qingjiaowoxiaoxioashou/p/6410588.html 根據連結時期的不同,庫又有靜態庫和動態庫之分。靜態庫是在連結階段被連結的,所以生成的可執行檔案就不受庫的影響,即使庫被刪除,程式依然可以成功執行。而動態庫是在程式執行的時

python3使用ctypes在windows中訪問CC++動態連結函式示例

python3使用ctypes在windows中訪問C和C++動態連結庫函式示例 這是我們的第一個示例,我們儘量簡單,不傳參,不返回,不訪問其他的動態連結庫 一 測試環境介紹和準備 測試環境: 作業系統:windows10 Python版本:3.7.0 VS版本:vs2015社群版(免費) 相關

靜態連結(LIB)動態連結(DLL),DLL的靜態載入動態載入,兩種LIB檔案。

靜態連結庫(LIB)和動態連結庫(DLL),DLL的靜態載入和動態載入,兩種LIB檔案。 一、 靜態連結庫(LIB,也簡稱“靜態庫”)與動態連結庫(DLL,也簡稱“動態庫”)的區別 靜態連結庫與動態連結庫都是共享程式碼的方式,如果採用靜態連結庫,則無論你願不願意,lib 中的指令都全部被直接包含在最

動態連結(DLL)的建立使用

最近想做個記錄日誌的C++庫,方便後續使用。想著使用動態庫,正好沒用過,學習下。概念這裡不贅述。學習過程中碰到的幾點,記錄下來。學習是個漸進的過程,本文也是一個逐漸完善的過程。 一、Static Library 標準Turbo 2.0中的C函式庫(scanf、pringf、memc

動態連結隱式建立呼叫

1.建立 我選的WIN32控制檯,下一步,勾DLL選項。 在專案新建一個類,在類前面加__declspec(dllimport) #define MYDLL  __declspec(dllexport)#else#define MYDLL  __declspec(dl

Linux中,.a.so,其實就是靜態連結動態連結

詳細查了一下,.a與.so的區別,其實就是靜態連結庫與動態連結庫。有一篇博文,很詳細,附上鍊接:http://blog.csdn.net/nieyinyin/article/details/6890557   Linux下的.so是基於Linux下的動態連結,其功能和作用類

動態連結靜態連結的相互包含問題及實現

動態連結庫和靜態連結庫的基本概念請參考 1.《深入理解計算機系統》第七章連結 2.《程式設計師的自我修養》第4章 靜態連結和第7章 動態連結 3. http://blog.jobbole.com/86852/ 目的 為了封裝程式碼,簡化介面,我們要把已有應用程式碼封裝為