dll靜態編譯vs2010
① vs2010為什麼設置了靜態編譯還是需要dll文件才能運行exe
1、自己把相關的文件從在正常工作的安裝目錄中,打到這件文件,然後復制到出現問題軟體的目錄下。復製成功後,還要進行注冊。
2、打開騰訊電腦管家,在工具箱裡面有一個電腦診所功能,可以進行修復文件缺失的問題。
3、實在不行就只有重裝系統了
② vs2010怎麼調用.dll和.lib
C++ 調用.lib的方法:
一: 隱式的載入時鏈接,有三種方法
1 設置工程的 Projects來載入DLL的lib文件
打開工程的 Projects菜單,然後在Linker/Additional Library Directories中加入lib文件所在的路徑,在Input/Additional Dependencies加入lib文件名稱,如(my.lib) ,然後在要使用該函數的地方加上該LIB的頭文件,如#include "..\lib.h"即可(沒有頭文件當然就不用了),而且應用程序運行時也需要dll文件。
32 通過程序代碼的方式
加入預編譯指令#pragma comment (lib,"*.lib"),這種方法優點是可以利用條件預編譯指令鏈接不同版本的LIB文件。因為,在Debug方式下,產生的LIB文件是Debug版本,如Regd.lib;在Release方式下,產生的LIB文件是Release版本,如Regr.lib。然後在首先要使用該函數的地方加上該LIB的頭文件,如#include "..\lib.h"即可(沒有頭文件當然就不用了)。
當應用程序對鏈接庫的LIB文件載入後,還需要把鏈接庫對應的頭文件(*.h)包含到其中,在這個頭文件中給出了鏈接庫中定義的函數原型。
二, 顯式的調用鏈接庫
隱式鏈接雖然實現較簡單,但除了必須的*.dll文件外還需要DLL的*.h文件和*.lib文件,在那些只提供*.dll文件的場合就無法使用,而只能採用顯式鏈接的方式。這種方式通過調用API函數來完成對DLL的載入與卸載,能更加有效地使用內存,在編寫大型應用程序時往往採用此方式。這種方法編程具體實現步驟如下:
①使用Windows API函數Load Library或者MFC提供的AfxLoadLibrary將DLL模塊映像到進程的內存空間,對DLL模塊進行動態載入。
②使用GetProcAddress函數得到要調用DLL中的函數的指針。
③不用DLL時,用Free Library函數或者AfxFreeLibrary函數從進程的地址空間顯式卸載DLL。
例:在應用程序中調用dll文件
——在應用程序中要首先裝入dll後才能調用導出表中的函數,例如用mfc
創建基於對話框的工程test,並在對話框上放置"load"按鈕,先添加裝載代碼。
1.首先在testdlg.cpp的首部添加變數設置代碼:
//設置全局變數glibsample用於存儲dll句柄
HINSTANCE glibsample=null; //如果定義成HANDLE類型,則出錯
//第二個變數showme是指向dll
庫中showme()函數的指針
typedef int(* Showme)(void);
Showme showme;
2.利用classwizard為"load"按鈕添加裝載dll的代碼
void ctestdlg::onloadbutton()
{
//要添加的代碼如下
if(glibsample!=NULL)
{
AfxMessageBox("the sample.dll has already been load.");
return;
}
//裝載sample.dll,未加路徑,將在三個默認路徑中尋找 (1)windows的系統目錄:\windows\system;
//(2)dos中path所指出的任何目錄;
//(3)程序所在的目錄;
glibsample=Loadlibrary("sample.dll");
//返回dll中showme()函數的地址
showme=(Showme)GetProcAddress(glibsample,"showme");
靜態鏈接庫LIB和動態鏈接庫DLL的區別
1.什麼是靜態連接庫,什麼是動態鏈接庫
靜態鏈接庫與動態鏈接庫都是共享代碼的方式,如果採用靜態鏈接庫,則無論你願不願意,lib 中的指令都全部被直接包含在最終生成的 EXE 文件中了。但是若使用 DLL,該 DLL 不必被包含在最終 EXE 文件中,EXE 文件執行時可以「動態」地引用和卸載這個與 EXE 獨立的 DLL 文件。靜態鏈接庫和動態鏈接庫的另外一個區別在於靜態鏈接庫中不能再包含其他的動態鏈接庫或者靜態庫,而在動態鏈接庫中還可以再包含其他的動態或靜態鏈接 庫。靜態鏈接庫與靜態鏈接庫調用規則總體比較如下。
對於靜態鏈接庫(比較簡單):
首先,靜態鏈接庫的使用需要庫的開發者提供生成庫的.h頭文件和.lib文件,應用程序運行時還依賴.dll文件。
生成庫的.h頭文件中的聲明格式如下:
extern "C" 函數返回類型 函數名(參數表);
在調用程序的.cpp源代碼文件中如下:
#include "..\lib.h"
#pragma comment(lib,"..\\debug\\libTest.lib")
//指定與靜態庫一起鏈接
第二,因為靜態鏈接庫是將全部指令都包含入調用程序生成的EXE文件中。因此如果用的是靜態鏈接庫,那麼也就不存在「導出某個函數提供給用戶使用」的情況,要想用就得全要!要不就都別要!:)
對於動態鏈接庫:
動態鏈接庫的使用需要庫的開發者提供生成的.lib文件,.dll文件和*.h文件或者只提供dll和*.h文件。
*.h文件主要是知道函數原型使用。
首先我們必須先注意到DLL內的函數分為兩種:
(1)DLL 導出函數,可供應用程序調用;
(2)DLL 內部函數,只能在 DLL 程序使用,應用程序無法調用它們。
因此調用程序若想調用DLL中的某個函數就要以某種形式或方式指明它到底想調用哪一個函數。
③ vs2010 靜態編譯
你說得很矛盾.....
大概意思是不是你在你自己的電腦上寫的程序在別的電腦上不能運行??
如果是的話我知道你大概的問題是什麼了。如果排除了系統版本的兼容性問題的話我能想到的就是,那台電腦沒有你這個程序運行所需要的庫。
1.如果你這個程序用出c/c++在Debug配置下通過編譯,鏈接的話它所需的庫是Microsoft.VC80.DebugCRT.一般情況下沒有裝VS的電腦下都沒有這個庫的,這樣的話你讓你的程序在Release配置下編譯鏈接就行了。
2.如果應經是Release配置的話 用文本方式打開你的程序到裡面在程序集清單中找到你程序需要的庫然後在你電腦上復制過去 具體到網上找找看.
3.你說你的是控制台程序 如果是沒有顯示錯誤對話框而是那種沒有反應的話 只能想到是你的程序執行完了快到你沒有發覺它結束了 那麼你在你的程序結尾加上char a = getchar(); 這段代碼
④ vs2010下靜態載入dll文件,每次都要把.dll .lib 復制到目錄下,但書上說可以設置系統環境變數就不要復制
用的VS2003,沒用2010,不過估計也差不多。
調試目錄表示的是當你在VS環境中直接調用調試時,在哪兒尋找執行程序所需的資源。
按你的說法,你想實現的應該是生成Dll後,不需要拷貝Dll到目標目錄就可以直接執行程序調用最新的Dll。
可以按如下設置dll項目,假設程序所在目錄為C:\abc\abc.exe
1、屬性-》調試-》命令設為主程序 C:\abc\abc.exe
1、屬性-》調試-》工作目錄設為主程序所在目錄 C:\abc
2、將dll項目設置中鏈接器-》常規-》輸出文件改為C:\abc\XXX.dll
設置完後就可以直接使用調試命令了。
⑤ 如何把dll文件添加到vs2010編寫的程序中
打開Visual Studio 2010
2
新建項目:文件》新建》項目
選擇Visual c++》Win32 項目》輸入項目名稱,選擇保存目錄,單擊「確定」按鈕
進入Win32應用程序向導,單擊「下一步」按鈕
應用程序類型選擇DLL,附加選項選擇空項目,單擊「完成」按鈕
添加新類頭文件:在項目的頭文件目錄上單擊滑鼠右鍵》添加》新建項
已安裝的模板選擇Visual C++》頭文件》輸入文件名稱,單擊「添加」按鈕
添加新類源文件:在項目的源文件目錄上單擊滑鼠右鍵》添加》新建項
已安裝的模板選擇Visual C++》c++文件》輸入文件名稱,單擊「添加」按鈕
為新類添加內容。內容如下:
頭文件simpleDLL.h:
源文件simpleDLL.cpp:
生成解決方案,OK,下一篇講如何用VS2010編寫動態鏈接庫DLL的單元測試用例,調用DLL測試正確性
⑥ vs2010為什麼設置了靜態編譯還是需要dll文件才能運行exe
靜態編譯:就是在編譯可執行文件的時候,將可執行文件需要調用的對應動態鏈接庫(.so)中的部分提取出來,鏈接到可執行文件中去,使可執行文件在運行的時候不依賴動態鏈接庫。
編譯方式:
第1種:
設置:
1、項目->配置屬性->常規->MFC的使用:在靜態庫中使用MFC
2、項目 -> 配置屬性->C/C++->代碼生成->運行庫 :選擇 多線程調試(/MTd)。
編譯時,選擇的是debug,win32
然後執行編譯生成方案,在該工程目錄下的debug文件中,找到該.exe文件,即可在其他電腦運行。
第2種:
一般可以配置一下兩項:
1.項目 -> 配置屬性->常規->MFC的使用 :在靜態庫中使用MFC。
2.項目 -> 配置屬性->C/C++->代碼生成->運行庫 :選擇 多線程調試(/MT)。
編譯時,選擇的是release,win32(這個選擇項在工具欄的debug選框中,一般我們使用debug方式)
⑦ 在VS2010下怎樣調用 VS2010生成的dll
若要創建引用並使用剛剛創建的動態鏈接庫的應用程序,請從「文件」菜單中選擇「新建」,然後選擇「項目…」。 從「項目類型」窗格中,選擇「Visual C++」下的「Win32」。 從「模板」窗格中,選擇「Win32 控制台應用程序」。 為項目選擇一個名稱,如「MyExecRefsDll」,並將其輸入「名稱」欄位。從「解決方案」旁邊的下拉列表中選擇「添入解決方案」。這會將新項目添加到該動態鏈接庫所屬的同一個解決方案中。 按「確定」啟動「Win32 應用程序向導」。在「Win32 應用程序向導」對話框的「概述」頁中,按「下一步」。 從「Win32 應用程序向導」的「應用程序設置」頁中,選擇「應用程序類型」下的「控制台應用程序」。 從「Win32 應用程序向導」的「應用程序設置」頁中,取消選擇「附加選項」下的「預編譯頭」。 按「完成」創建項目。
⑧ vs2010怎麼編譯生成dll文件
可以在開始建立新項目的時候選擇DLL類型進行編寫
一般情況下有四種可選的類型:windows應用程序,控制台應用程序,DLL,靜態庫。
當完成DLL的編寫之後,點擊菜單欄【生成】->【生成解決方案】然後進入該解決方案源文件夾下找到bin->Debug會發現DLL文件已經生成。