主函數怎麼調用動態庫的編譯時間
Ⅰ C/C++中動態鏈接庫的創建和調用的步驟
動態連接庫的創建步驟:
一、創建Non-MFC DLL動態鏈接庫
1、打開File —> New —> Project選項,選擇Win32 Dynamic-Link Library —>sample project—>工程名:DllDemo
2、新建一個.h文件DllDemo.h
以下是引用片段:
#ifdefDllDemo_EXPORTS
#defineDllAPI__declspec(dllexport)
#else
#defineDllAPI__declspec(dllimport)
extern"C"//原樣編譯
{
DllAPIint__stdcallMax(inta,intb);//__stdcall使非C/C++語言內能夠調用API
}
#endif
3、在DllDemo.cpp文件中導入DllDemo.h文件,並實現Max(int,int)函數,以下是引用片段:
#include"DllDemo.h"
DllAPIint__stdcallMax(inta,intb)
{
if(a==b)
returnNULL;
elseif(a>b)
returna;
else
returnb;
}
4、編譯程序生成動態連接庫
二、用.def文件創建動態連接庫DllDemo.dll。
1、刪除DllDemo工程中的DllDemo.h文件。
2、在DllDemo.cpp文件頭,刪除 #include DllDemo.h語句。
3、向該工程中加入一個文本文件,命名為DllDemo.def並寫入如下語句:
LIBRARY MyDll
EXPORTS
Max@1
4、編譯程序生成動態連接庫。
動態鏈接的調用步驟:
一、隱式調用
1、 建立DllCnslTest工程
2、 將文件DllDemo.dll、DllDemo.lib拷貝到DllCnslTest工程所在的目錄
3、 在DllCnslTest.h中添加如下語句:
以下是引用片段:
#defineDllAPI__declspec(dllimport)
#pragmacomment(lib,"DllDemo.lib")//在編輯器link時,鏈接到DllDemo.lib文件
extern"C"
{
DllAPIint__stdcallMax(inta,intb);
}
4、在DllCnslTest.cpp文件中添加如下語句,以下是引用片段:
#include"DllCnslTest.h"//或者#include"DllDemo.h"
voidmain()
{
intvalue;
value=Max(2,9);
printf("TheMaxvalueis%d
",value);
}
5、編譯並生成應用程序DllCnslTest.exe
二、顯式調用
1、 建立DllWinTest工程
2、 將文件DllDemo.dll拷貝到DllWinTest工程所在的目錄或Windows系統目錄下。
3、 用vc/bin下的Dumpbin.exe的小程序,查看DLL文件(DllDemo.dll)中的函數結構。
4、 使用類型定義關鍵字typedef,定義指向和DLL中相同的函數原型指針。
例:
以下是引用片段:
typedefint(*lpMax)(inta,intb);//此語句可以放在.h文件中
5、 通過LoadLibray()將DLL載入到當前的應用程序中並返回當前DLL文件的句柄。
例:
以下是引用片段:
HINSTANCEhDll;//聲明一個Dll實例文件句柄
hDll=LoadLibrary("DllDemo.dll");//導入DllDemo.dll動態連接庫
6、 通過GetProcAddress()函數獲取導入到應用程序中的函數指針。
例:
以下是引用片段:
lpMaxMax;
Max=(lpMax)GetProcAddress(hDLL,"Max");
intvalue;
value=Max(2,9);
printf("TheMaxvalueis%d",value);
7、 函數調用完畢後,使用FreeLibrary()卸載DLL文件。
FreeLibrary(hDll);
8、 編譯並生成應用程序DllWinTest.exe
Ⅱ VC程序調用動態庫,編譯時候也跟著編譯動態庫
不太清楚你的工程是如何建立的,想必一個工程是生成動態鏈接庫,另一個是調用程序EXE了。由於VC動態庫有兩種形式,Regular和Extended兩種,其中一種能導出類,另一種只能導出變數和函數。如果導出的是類,你在編譯EXE文件時自然需要用到類得聲明文件,即你前面所說的動態庫本身所引用的文件。如果導出的是函數或變數,有可能出現的情況是:一般為了代碼的重用性,把需要導出的函數或變數單獨放在一個頭文件中,用一個宏控制其導入、導出。編譯動態庫時,宏定義為導出,編譯EXE時,宏變為導入,這個頭文件為兩者共用。如果不小心在這個頭文件中包含了其他頭文件,也可能出現你說的情況。如果動態庫調用直接採用函數入口地址的方法,則什麼都不用聲明,當然,只適用於導出函數與變數的情形。
Ⅲ 如何創建與調用動態鏈接庫
動態鏈接庫:dll不必被包含在最終的EXE中,EXE文件執行時可以動態地引用和卸載DLL文件。
同時,靜態鏈接庫中不能再包含其他的動態鏈接庫或靜態庫,而動態鏈接庫中可以包含其他的動態或靜態庫。
VC++支持的DLL:
DLL的編制與具體的編程語言及編譯器無關,動態鏈接庫隨處可見,VC++支持三種DLL:非MFC動態庫、MFC規則DLL和MFC擴展DLL。DLL導出函數(或變數、類)可供應用程序調用;DLL內部函數只能在DLL程序內使用,應用程序無法調用它們。
導出函數的聲明方式:
一種在函數聲明類型和函數名之間加上「_declspec(dllexport)」。
另外一種採用模塊定義(.def)文件聲明,需要在庫工程中添加模塊文件,格式如下:
LIBRARY 庫工程名稱
EXPORTS 導出函數名
DLL的調用方式:
一種靜態調用,由編譯系統完成對DLL的載入和應用程序結束時DLL的卸載。
另外一種動態調用,由編程者用API函數載入和卸載DLL(DLL載入—DLL函數地址獲取—DLL釋放)方式。
所有庫工程編譯時必須Release方式:
Build—set active configuration—選擇庫工程的release方式
示例:
一、 函數----創建動態鏈接庫(MFC規則DLL)
1. New--projects--MFC AppWizard(dll)--Regular DLL using shared MFC DLL //取名為MFC_dll
2. def文件中添加:函數名(Add_new)
3. h文件中添加:外部函數聲明//求和函數,函數名為Add_new
extern "C" __declspec(dllexport) int __stdcall Add_new(int a,int b);
4. cpp文件中添加: 外部函數實現
extern "C" __declspec(dllexport) int __stdcall Add_new(int a,int b)
{
return a+b;
}
5. build--set active configuration--win32 release--ok
6. 生成
7. 根目錄下release文件夾中dll,lib與根目錄下h文件即為所需
二、 函數----調用動態鏈接庫(把MFC_dll.dll和MFC_dll.lib拷到工程所在目錄)
//靜態調用(.h可以寫到.cpp文件中)
1. new--projects--win32 console application--an empty project
2. 添加h文件:(test.h)
#pragma comment(lib,"MFC_dll.lib") //告訴編譯器DLL相對應的lib文件所在路徑和文件名
extern "C" _declspec(dllimport) int _stdcall Add_new(int a,int b);//聲明導入函數
3. 添加cpp文件:(main.cpp)
#include "test.h"
int main()
{
cout<<Add_new(10,3);
return 0;
}
//動態調用
#include <stdio.h>
#include <windows.h>
typedef int (* lpAddFun)(int ,int);//定義一個與Add_new函數接受參數類型和返回值均相同的函數指針類型
int main()
{
HINSTANCE hDll;//句柄
lpAddFun addFun;//函數指針
hDll=LoadLibrary("dllTest.dll");//動態載入DLL模塊句柄
if(hDll)
{
addFun=(lpAddFun) GetProcAddress(hDll,"Add_new");//得到所載入DLL模塊中函數的地址
if(addFun)
{
int result=addFun(2,3);
printf("%d",result); } FreeLibrary(hDll);//釋放已經載入的DLL模塊
}
return 0;
}
三、 變數----創建動態鏈接庫(非MFC DLL)
1. new---projects---win32 dynamic-link library----an empty project(Sample)
2. 添加sample.h
#ifndef SAMPLE_H
#define SAMPLE_H
extern int dllGlobalVar;
#endif
3. 添加 sample.cpp
#include "sample.h"
#include <windows.h>
int dllGlobalVar;
bool APIENTRY DllMain(HANDLE hMole,DWORD ul_reason_for_call,LPVOID lpReserved)
//windows在載入DLL時,需要一個入口函數,就如同控制台或DOS程序需要main函數、win32程序需要winmain函數一樣。所以引入一個不做任何操作的預設DllMain的函數版本。是DLL的內部函數。
Ⅳ unix 下的C++編程在編譯時怎麼鏈接動態庫第二個問題 在程序中怎麼調用
你說的是手動顯示調用,不是靜態隱式調用。
#include<dlfcn.h>
此頭文件在編譯時需要加入 -ldl選項
動態鏈接庫 必須加入:-fpic選項。
------
void *dll=NULL;//保存動態鏈接庫的句柄。
int (*dll_fun)(char*)=NULL;//想要調用的函數指針。
dll=dlopen("/lib/XXX.so", RTLD_NOW)//打開so文件。
dll_fun=dlsym(dll,"my_print");//獲取指定函數的指針。
dll_fun("Call my_print");
dlclose(dll)
---
編譯鏈接有兩種方法,
1. 使用-lXX 選項,gcc會自動在庫路徑中鏈接libXX.so的文件 gcc main.c -lstdc++ -omain
2. 在命令行中將庫路徑作為參數傳入。 gcc main.c /lib/libstdc++.so -omain
Ⅳ C++中動態庫調用動態庫如何調用啊
動態連接庫的創建步驟:
一、創建Non-MFC DLL動態鏈接庫
1、打開File —> New —> Project選項,選擇Win32 Dynamic-Link Library —>sample project—>工程名:DllDemo
2、新建一個.h文件DllDemo.h
以下是引用片段:
#ifdefDllDemo_EXPORTS
#defineDllAPI__declspec(dllexport)
#else
#defineDllAPI__declspec(dllimport)
extern"C"//原樣編譯
{
DllAPIint__stdcallMax(inta,intb);//__stdcall使非C/C++語言內能夠調用API
}
#endif
3、在DllDemo.cpp文件中導入DllDemo.h文件,並實現Max(int,int)函數,以下是引用片段:
#include"DllDemo.h"
DllAPIint__stdcallMax(inta,intb)
{
if(a==b)
returnNULL;
elseif(a>b)
returna;
else
returnb;
}
4、編譯程序生成動態連接庫
二、用.def文件創建動態連接庫DllDemo.dll。
1、刪除DllDemo工程中的DllDemo.h文件。
2、在DllDemo.cpp文件頭,刪除 #include DllDemo.h語句。
3、向該工程中加入一個文本文件,命名為DllDemo.def並寫入如下語句:
LIBRARY MyDll
EXPORTS
Max@1
4、編譯程序生成動態連接庫。
動態鏈接的調用步驟:
一、隱式調用
1、 建立DllCnslTest工程
2、 將文件DllDemo.dll、DllDemo.lib拷貝到DllCnslTest工程所在的目錄
3、 在DllCnslTest.h中添加如下語句:
以下是引用片段:
#defineDllAPI__declspec(dllimport)
#pragmacomment(lib,"DllDemo.lib")//在編輯器link時,鏈接到DllDemo.lib文件
extern"C"
{
DllAPIint__stdcallMax(inta,intb);
}
4、在DllCnslTest.cpp文件中添加如下語句,以下是引用片段:
#include"DllCnslTest.h"//或者#include"DllDemo.h"
voidmain()
{
intvalue;
value=Max(2,9);
printf("TheMaxvalueis%d
",value);
}
5、編譯並生成應用程序DllCnslTest.exe
二、顯式調用
1、 建立DllWinTest工程
2、 將文件DllDemo.dll拷貝到DllWinTest工程所在的目錄或Windows系統目錄下。
3、 用vc/bin下的Dumpbin.exe的小程序,查看DLL文件(DllDemo.dll)中的函數結構。
4、 使用類型定義關鍵字typedef,定義指向和DLL中相同的函數原型指針。
例:
以下是引用片段:
typedefint(*lpMax)(inta,intb);//此語句可以放在.h文件中
5、 通過LoadLibray()將DLL載入到當前的應用程序中並返回當前DLL文件的句柄。
例:
以下是引用片段:
HINSTANCEhDll;//聲明一個Dll實例文件句柄
hDll=LoadLibrary("DllDemo.dll");//導入DllDemo.dll動態連接庫
6、 通過GetProcAddress()函數獲取導入到應用程序中的函數指針。
例:
以下是引用片段:
lpMaxMax;
Max=(lpMax)GetProcAddress(hDLL,"Max");
intvalue;
value=Max(2,9);
printf("TheMaxvalueis%d",value);
7、 函數調用完畢後,使用FreeLibrary()卸載DLL文件。
FreeLibrary(hDll);
8、 編譯並生成應用程序DllWinTest.exe
Ⅵ 怎麼調用動態鏈接庫函數
一般有兩種調用方式:
1、靜態調用。將編譯之後的dll和所對應的lib文件放到要調用它們的工程所在路徑,然後添加如下代碼:
#pragma
comment(lib,"dege.lib")
extern
"C"
__declspec(dllimport)
FuncA(//參數);
然後可以直接使用FuncA函數了,跟普通函數一樣。這個其實是一個靜態庫,因為你很可能沒有lib文件,所以建議使用第二種方式:
2、動態調用。
typedef
int(*lpFunA)(int,
int);
//宏定義函數指針類型,這里假設你的FuncA是一個int型的函數,且帶兩個int型的參數,你可以假設為是一個求和的Add函數。
在要使用FunA的地方添加如下代碼
HINSTANCE
hDll;//定義個DLL句柄
lpFunA
addFun;//自定義函數的指針
hDll=LoadLibrary("..\\Debug\\dege.dll");//動態載入dll,這里假設你的dll放在你要調用它的工程的debug下
if(hDll!=NULL)
{
addFun=(lpFunA)GetProAddress(hDll,"FunA");//獲得FunA的地址
if(FunA!=NULL)
{
//這里正常使用addFun,跟普通函數一樣
}
FreeLibrary(hDll);//用完之後要釋放句柄
}
Ⅶ 用C語言,怎麼算出主函數調用函數時,該函數的執行時間。舉個例子,謝謝啊。請高手幫忙
int main()
{
int TimeStart = GetTickCount();
Sum();//這個是你要調用的函數
int TimeEnd = GetTickCount();
int Time = TimeEnd - TimeStart;
//Time的值 就是調用Sum()函數所用的時間
}
簡單的寫了一下,希望能幫到你