vs2010編譯靜態庫
① 你好,我現在用qt中要使用了一個vs2010編譯的.lib靜態庫。
對於C語言而言,用於連接dll的連接lib是可以通用的,dll也是可以通用的。但是靜態庫目前而言並不是通用的,一般的處理方式是編譯成dll,然後生成連接lib(a)庫,引入項目,或者使用libtdl動態載入dll文件。
靜態庫不可通用的原因是,基礎庫相差太多,objmp甚至都無法識別使用vc默認選項編譯出啦的obj文件格式。另外reimp不是用於這個用途的,是為dll的連接lib(a)文件提供轉換的。
對於C++而言,所有二進制代碼都是不可通用的,畢竟名稱修飾都相差甚遠。
② vs2010 怎麼添加 靜態庫
可以配置一下兩項:項目
->
配置屬性->常規->MFC的使用
:在靜態庫中使用MFC(此項必須設置)。
項目
->
配置屬性->C/C++->代碼生成->運行庫
:選擇/MT。(此項可選,設置之後部分機器可能會編譯出錯)
③ vs 封裝靜態庫怎樣把第三方庫編譯進去
在企業開發中,一些核心技術或者常用框架,出於安全性和穩定性的考慮,不想被外界知道,所以會把核心代碼打包成靜態庫,只暴露頭文件給程序員使用(比如:友盟、網路地圖等第三方的sdk) 靜態庫和動態庫的存在形式 靜態庫:.a 和 .framework 動...
④ vs2010怎麼編譯生成dll文件
可以在開始建立新項目的時候選擇DLL類型進行編寫
一般情況下有四種可選的類型:windows應用程序,控制台應用程序,DLL,靜態庫。
當完成DLL的編寫之後,點擊菜單欄【生成】->【生成解決方案】然後進入該解決方案源文件夾下找到bin->Debug會發現DLL文件已經生成。
⑤ 在VS2010或VC6.0中,如何安裝Zthread多線程庫
一、在Windows下使用ZThread
首先,下載ZThread,解壓到某個目錄下,我解壓到D:\libs\ZThread-2.3.2\中。
方法1:包含源文件直接編譯(不推薦)
1.在vs2010中,新建一個新的win32 控制台項目,選擇空項目。
2.在源目錄下新建一個main.cpp文件,在http://zthread.sourceforge.net/html/classZThread_1_1Thread.html 中復制一段示例代碼拷貝到main.cpp中。
3.在項目的配置屬性中,VC++目錄的包含目錄中增加ZThread的頭文件目錄,我這里是:D:\libs\ZThread-2.3.2\include。配置屬性分DEBUG和RELEASE兩個,默認選擇的是DEBUG配置,但最好兩個都配置一下,否則生成RELEASE版本時會報錯
4.在項目中新建一個文件夾,名字隨意,我的叫ZThread,然後選擇這個文件夾,右鍵選擇添加->現有項,將ZThread解壓目錄中的src目錄的所有cxx文件都加入到這個目錄中
然後現在可以編譯了,正常來說,應該編譯通過並且成功啟動程序了。
但也有可能出現一些錯誤:
錯誤一:error C2664: 「GetMoleHandleW」: 不能將參數 1 從「const char [13]」轉換為「LPCWSTR」
這個是由於vs2010的項目設置默認採用了unicode字元集導致的,可以在項目屬性中將字元集改為多位元組即可,也可以在GetMoleHandle函數的字元串參數加上_T()包含,改為GetMoleHandle(_T("Kernel32.dll"));
方法2:編譯成靜態庫
1.在vs2010中,新建一個新的win32 控制台項目,我取名為ZThread.,項目類型選擇為靜態庫。
2.在項目的配置屬性中,VC++目錄的包含目錄中增加ZThread的頭文件目錄,我這里是:D:\libs\ZThread-2.3.2\include。配置屬性分DEBUG和RELEASE兩個,默認選擇的是DEBUG配置,但最好兩個都配置一下,否則生成RELEASE版本時會報錯
3.在項目源目錄中,右鍵選擇添加->現有項,將ZThread解壓目錄中的src目錄的所有cxx文件都加入到這個目錄中
然後現在可以編譯了,正常來說,應該編譯通過並且成功生成了ZThread.lib靜態庫。
但也有可能出現一些錯誤:
錯誤一:error C2664: 「GetMoleHandleW」: 不能將參數 1 從「const char [13]」轉換為「LPCWSTR」
這個是由於vs2010的項目設置默認採用了unicode字元集導致的,可以在項目屬性中將字元集改為多位元組即可,也可以在GetMoleHandle函數的字元串參數加上_T()包含,改為GetMoleHandle(_T("Kernel32.dll"));
靜態庫的使用方法是:
在我們的程序的工程屬性的VC++目錄的包含目錄中,增加ZThread的頭文件目錄。
在程序代碼中,增加#pragma comment(lib, 「ZThread.lib」)聲明,同時,需要將ZThread.lib文件放在我們的源目錄下,跟代碼放一起。
方法3,編譯成動態庫DLL
跟方法2差不多,只不過項目類型選擇為動態庫。其他步驟一樣,不再詳述,編譯成功後,會生成ZThread.lib, ZThread.dll。
使用動態庫的方法跟靜態庫一致,不同的是,使用動態庫的程序在運行時需要ZThread.dll文件。
至此,靜態鏈接庫和動態鏈接庫我們就說完了,我們做一下對比和補充:
兩個lib文件的不同
我們發現,無論是靜態鏈接庫還是動態鏈接庫,最後都有lib文件,那麼兩者區別是什麼呢?其實,兩個是完全不一樣的東西。兩個ZThread.lib大小都不同,靜態庫對應的lib文件叫靜態庫,動態庫對應的lib文件叫導入庫。實際上靜態庫本身就包含了實際執行代碼、符號表等等,而對於導入庫而言,其實際的執行代碼位於動態庫中,導入庫只包含了地址符號表等,確保程序找到對應函數的一些基本地址信息。
對於靜態鏈接庫,我們在編譯和鏈接的時候已經將所有的代碼都導入進來,因此,當生成可執行文件以後,可執行文件包含所有的代碼。因此,在可執行文件運行時就不再需要靜態庫了,這也是為什麼我們刪掉ZThread.lib程序照樣執行;而對於動態鏈接庫,實際上,可執行文件不包含DLL中的內容,只是通過導入庫(.lib)知道了相應的地址信息,因此,可執行文件在運行時動態得去載入DLL,這也是為什麼我們刪掉ZThread.dll後程序就不能執行了。
對於DLL,我們是可以不要lib文件的。如果不要lib文件,我們可以通過函數指針的使用達到我們的目的。
⑥ 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中,項止屬性有個選項: 「使用標准 windows庫」與「在靜態庫中使用MFC」有什麼區別
首先一個mfc開發程序是需要一些dll庫的,如果選擇後者,這些庫在編譯的時候會集成到編譯出來的exe文件中,這樣的優點是這個文件可以拿到幾乎任何windows的電腦上直接運行,缺點是文件體積較大,因為都集成進去了。
選擇前者的話不會集成dll,每次運行的時候需要調用系統的dll庫,一般位置在windows/ststem32
這樣文件體積是小了,但是程序拿到某些電腦上可能不能直接運行,提示找不到庫
⑧ vs 命令行編譯靜態庫
_declspec(dllexport) void test_print(char* sz_input);
這是動態鏈接庫 -- dllexport ,dll是動態鏈接庫。
不是你說的靜態庫。
動態鏈接庫,應用程序調用它,編譯鏈接時要有.lib, 運行時要有.dll
Debug\ -- 給別的程序用,要用 Release\,不能用 Debug\
char * __ptr64 sz_input;
__ptr64 -- 32位機上,指針sz_input截斷為32位.
char * __ptr32 sz_input;
__ptr32 -- 64位機上,指針sz_input變32位
wchar_t,_MBCS -- 表明你要用雙位元組字元,那麼程序就不應當用 單位元組char 型。如果你要編的不是要用雙位元組字元,那麼 就不要 wchar_t,_MBCS。
⑨ VS2010修改C++項目為「靜態庫中使用MFC」編譯問題
(1)項目 -> **屬性 -> 配置屬性 -> 常規 -> MFC的使用 :在靜態庫中使用MFC。
(2)項目 -> **屬性 -> 配置屬性 -> C/C++ -> 代碼生成 -> 運行庫 :多線程(/MT)。
2 在debug的時候要選 /MTd, Release 版本的再用 /MT
⑩ C語言vs怎麼使用自己做的靜態庫與動態庫,本人小白,請求詳解
1.靜態鏈接庫
打開VS2010,新建一個項目,選擇win32項目,點擊確定,選擇靜態庫這個選項,預編譯頭文件可選可不選。
在這個空項目中,添加一個.h文件和一個.cpp文件。名字我們起為static.h和static.cpp
static.h文件:
[cpp]view plain
#ifndefLIB_H
#defineLIB_H
extern"C"intsum(inta,intb);
#endif
- static.cpp文件:
#include"static.h"
intsum(inta,intb)
{
returna+b;
}
- 編譯這個項目之後,會在debug文件夾下生成static.lib文件,這個就是我們需要的靜態鏈接庫。
#include<stdio.h>
#include<stdlib.h>
#include"static.h"
#pragmacomment(lib,"static.lib")
intmain()
{
printf("%d ",sum(1,2));
system("pause");
return0;
}
- 編譯運行可得結果:3
#ifndefDYNAMIC
#defineDYNAMIC
extern"C"__declspec(dllexport)intsum(inta,intb);
#endifDYNAMIC
#include"dynamic.h"
intsum(inta,intb)
{
returna+b;
}
- 編譯這個項目,會在debug文件夾下生成dynamic.dll文件。
#include<stdio.h>
#include<stdlib.h>
#include<Windows.h>
#include"dynamic.h"
intmain()
{
HINSTANCEhDll=NULL;
typedefint(*PSUM)(inta,intb);
PSUMpSum;
hDll=LoadLibrary(L"dynamic.dll");
pSum=(PSUM)GetProcAddress(hDll,"sum");
printf("%d ",pSum(1,2));
system("pause");
FreeLibrary(hDll);
return0;
}
- 編譯運行結果為:3
[cpp]view plain
下面說明如何調用靜態鏈接庫。
首先需要新建一個空項目,起名為test。將之前static項目下的static.h和static.lib這個2個文件復制到test項目的目錄下,並在工程中加入static.h文件。
新建一個test.cpp文件如下:
[cpp]view plain
#pragma comment(lib,"static.lib"),這一句是顯式的導入靜態鏈接庫。除此之外,還有其他的方法,比如通過設置路徑等等,這里不做介紹。
2.動態鏈接庫
和創建靜態鏈接庫一樣,需要創建一個空的win32項目,選擇dll選項。創建dynamic.cpp和dynamic.h文件
dynamic.h文件:
[cpp]view plain
dynamic.cpp文件:
[cpp]view plain
下面介紹如何調用動態鏈接庫,這里講的是顯式的調用。
在剛才的test項目下,把static.lib和static.h文件刪除,把dynamic.h和dynamic.dll復制到該目錄下,並在項目中添加dynamic.h文件,修改test.cpp文件為:
[cpp]view plain
特別提示:
1.extern "C"中的C是大寫,不是小寫
2.如果從VS2010中直接運行程序,lib和dll需要放到test項目的目錄下;如果想雙擊項目test下的debug文件中的exe文件直接運行的話,需把lib和dll放入debug文件夾下。