當前位置:首頁 » 編程軟體 » c編譯成dll

c編譯成dll

發布時間: 2022-08-28 20:19:37

c語言程序怎麼編譯成dll文件供其他語言調用

C程序編譯成dll文件只不過是在要公開的介面函數聲明前面加上幾個特定的修飾符而已。
下面是個例子,用dev-cpp建了個dll的默認文檔
/*dll.h文件*/
#ifndef _DLL_H_
#define _DLL_H_
#if BUILDING_DLL
# define DLLIMPORT __declspec (dllexport)
#else /* Not BUILDING_DLL */
# define DLLIMPORT __declspec (dllimport)
#endif /* Not BUILDING_DLL */

DLLIMPORT void HelloWorld (void);

#endif /* _DLL_H_ */
/*dllmain.c文件*/
/* Replace "dll.h" with the name of your header */
#include "dll.h"
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
DLLIMPORT void HelloWorld ()
{
MessageBox (0, "Hello World from DLL!/n", "Hi", MB_ICONINFORMATION);
}

BOOL APIENTRY DllMain (HINSTANCE hInst /* Library instance handle. */ ,
DWORD reason /* Reason this function is being called. */ ,
LPVOID reserved /* Not used. */ )
{
switch (reason)
{
case DLL_PROCESS_ATTACH:
break;
case DLL_PROCESS_DETACH:
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
}
/* Returns TRUE on success, FALSE on failure */
return TRUE;
}

具體請參考jilei08124的CSDN博客

Ⅱ C++如何編譯出DLL文件

如果使用的是VS,可以進行如下操作:
1.
打開VS,
文件-新建-新建項目-其他語言-Visual
C++
- Win32
控制台應用程序。
2.
單擊確定後,彈出對話框,按照對話框「下一步」提示進行操作。
3.
將要編譯的C文件拷貝到CreateDLL項目中,.h文件就放到頭文件夾的目錄下,.c文件放到源文件目錄下,注意後綴名為.c的文件都要改成.cpp,否則編譯會出錯。
注意:申明函數時必須參照上圖紅框標示出來的規則,在Function.cpp文件中必須要引入對應的#include
CreateDLL.h。
4.
選中所有需要編譯成dll的cpp文件,右鍵-屬性-預編譯頭-不使用預編譯頭,然後選擇
「生成」即可,這樣在項目的Debug文件夾下面便可找到CreateDLL.dll文件

Ⅲ 如何編譯生成dll

使用VC下的cl和link手工創建dll並實現函數導入

1、創建dll頭文件:
/*
* dllmain.h
*/
#ifndef _DLLMAIN_H
#define _DLLMAIN_H

int getNumber();

#endif

2、創建dll源文件:
/*
* dllmain.c
*/
#include "dllmain.h"

int getNumber()
{
return 10;
}

3、 創建def文件:
; export.def
LIBRARY MY_DLLMAIN ; MY_DLLMAIN 將成為生成的dll的名稱
EXPORTS
getNumber @1 ; 這個名稱即為函數的實際導出名稱 @1為函數的導出編號

4、生成dll文件:
cl dllmain.c /c
link /def:export.def /dll dllmain.obj

這時,工程中已經包含了 dllmain.h dllmain.c export.def dllmain.obj dllmain.lib dllmain.exp MY_DLLMAIN.dll 其中,後4個文件是編譯鏈接過程中生成的文件

5、創建dlltest.c:
/*
* dlltest.c
*/
#include <stdio.h>
#include "dllmain.h" //dll庫的頭文件

#pragma comment(lib,"dllmain.lib") //dllmain.lib即是上一步生成的文件

int main()
{
printf("%dn",getNumber());
}

6、編譯、鏈接dlltest.c
cl dlltest.c /c
link dlltest.obj

注意:這里dllmain.lib和dllmain.h應該和dlltest.c在同一個目錄中。此步的結果將生成 dlltest.exe

7、運行:
dlltest

這時,系統將載入my_dllmain.dll這個動態鏈接庫,將調用其中的getNubmer函數。

Ⅳ 如何封裝c++程序成dll文件

C++編寫DLL的方法

在寫C++程序時,時常需要將一個class寫成DLL,供客戶端程序調用。這樣的DLL可以導出整個class,也可以導出這個class的某個方法。

一、導出整個class

方法很簡單,只需要在類的頭文件中class和類名之間加上_declspec(dllexport),同時在另外一份提供給客戶端調用程序使用的類的頭文件中class和類名之間加上_declspec(dllimport)。為了能讓客戶端程序和DLL程序公用該類的一份頭文件,通常在類的頭文件中使用宏和預編譯指令來處理。如下DLLTest.h:

#ifdef DLL_TEST_API

#else

#define
DLL_TEST_API _declspec(dllimport)
#endif

Class DLL_TEST_API CDLLTest
{

Public:
CDLLTest();

~CDLLTest();

int Add(
int
a, int
b);

};
DLLTest.cpp如下:

#define
DLL_TEST_API _declspec(dllexport)

#include 「DLLTest.h」

………………………………………
這樣,在DLL編譯時DLL_TEST_API被定義為_declspec(dllexport),而且客戶端程序編譯時它被定義為_declspec(dllimport)。

二、導出這個類的某個或者某幾個方法。

這時,需要將_declspec(dllexport)放到成員函數名前,如DLLTest.h:

#ifdef DLL_TEST_API

#else

#define
DLL_TEST_API _declspec(dllimport)
#endif

Class CDLLTest
{

Public:
CDLLTest();

~CDLLTest();
int DLL_TEST_API Add(
int
a, int
b);

};

但是,如果僅僅是這樣的話,當客戶端程序#include這個頭文件後,定義DLLTest這個類的一個對象後(靜態方式鏈接DLL),客戶端程序無法鏈接通過,會提示構造函數和析構函數無法解析,此時,需要將構造函數和析構函數前也加上DLL_TEST_API宏即可。

當然這里還有個問題就是類的函數在導出後,名字會發生變化,我們可以在函數名前再加上extern 「C」 ,如 extern 「C」 DLL_TEST_API int Add(int a ,int b);但這只解決了C與C++調用時名字變更問題,可靠的方法還是增加一個模塊定義文件def,在該文件中定義導出函數的名稱,我們將在後面看到樣例。

DLL編寫完成後,就只剩下客戶端程序如何去調用該DLL了,靜態方式調用DLL和動態方式調用DLL。

一、靜態方式調用DLL

這個方法就簡單了,將DLLTest.h頭文件和DLLTest.lib,DLLTest.dll文件拷貝到客戶端程序的當前目錄下,在客戶端程序中#include<DLLTest.h>,然後通過#pragma comment(lib,」DLLTest.lib」)的方式引入lib庫,或者在客戶端程序的工程屬性裡面增加對該lib文件的引入。

然後就可以在客戶端程序中如同使用本地的一個class一樣使用該DLL了,如:

CDLLTest dllTest;

dllTest.Add(
1
,2
);

二、動態方式調用DLL

動態調用這個DLL,就需要對這個class進行修改了。

首先,在DLLTest.cpp文件中增加一個全局函數,該函數可以返回這個class的一個實例,這樣,客戶端程序調用這個全局函數後,得到該class的實例,就可以調用該class的實例方法了。

extern
「C」 _declspec(dllexport) CDLLTest* GetInstance()
{

return
new
CDLLTest;
}
註:extern 「C」 只是解決了c與c++編譯器之間的兼容問題,如果需要和其他編譯器之間兼容,可靠的辦法還是增加一個.def文件,文件內容如下:

LIBRARY 「DLLTest」

EXPORTS

GetInstance
= GetInstance
這樣就指定了DLL的函數導出後的名稱仍然不變。

這樣,客戶端程序就可以通過該函數來獲取class的一個實例了。如下:

先需要定義一個函數指針類型:

typedef CDllTestBase* (*pfGetInst)();

//
註:CDllTestBase類後面會介紹。

HMOUDLE hMod
= LoadLibrary( _T(「DLLTest.DLL」) );

if(hMod)
{
pfGetInst pfGetInstance
= (pfGetInst)GetProcAddress(「GetInstance」);
if( p )
{

//
通過基類指針指向派生類對象

CDllTestBase * pInst = pfGetInstance ();
if( NULL
!= pInst )
{
pInst
->Add( 1
,2
);
}

if( NULL
!= pInst )
{

//
釋放對象

delete pInst;
}
}
}
當然,這里還是需要include這個DLL的頭文件DLLTestBase.h,如果將之前所寫的頭文件DLLTest.h直接拷貝到客戶端程序的當前目錄下,並include進來的話,在編譯連接時,是無法通過的,我們需要對這個頭文件進行修改,首先增加一個.h 文件DLLTestBase.h,在這個文件中我們將需要在客戶端程序中調用的函數都命名成純虛函數,然後讓CDLLTest類繼承自CDLLTestBase類,DLLTestBase.h如下:

Class CDLLTestBase
{
Public:
Virtual
~CDLLTestBase(){};//
虛析構函數,且為內聯函數

Virtual int
Add(int
a, int
b) = 0
;

}
DLLTest.h修改後如下:

#include 「DLLTestBase.h」
Class CDLLTest :
public
CDLLTestBase
{
Public:
CDLLTest();

~CDLLTest();

int
Add(int
a, int
b);
};
註:這里的DLLTestBase需要提供一個虛析構函數,這樣在客戶端程序中就可以通過基類指針來釋放派生類對象了。

這樣,只需要將DLLTestBase.h拷貝到客戶端程序的當前目錄下,然後在客戶端程序中#include」DLLTestBase.h」,就可以如上面介紹一樣在客戶端程序中調用DLL裡面的方法了。

Ⅳ c#使用命令行編譯生成dll文件

C#使用csc.exe編譯程序,csc使用/target:library(縮寫: /t:library)參數生成Dll文件。
其它參數如下:
Visual C# 編譯器選項
- 輸出文件 -
/out:<文件> 指定輸出文件名(默認值: 包含主類的文件或第一個文件的基名稱)
/target:exe 生成控制台可執行文件(默認) (縮寫: /t:exe)
/target:winexe 生成 Windows 可執行文件 (縮寫: /t:winexe)
/target:library 生成庫 (縮寫: /t:library)
/target:mole 生成能添加到其他程序集的模塊 (縮寫: /t:mole)
/target:appcontainerexe 生成 Appcontainer 可執行文件 (縮寫: /t:appcontainerexe)
/target:winmdobj 生成 WinMDExp 使用的 Windows 運行時中間文件 (縮寫: /t:winmdobj)
/doc:<文件> 要生成的 XML 文檔文件
/platform:<字元串> 限制可以在其上運行此代碼的平台: x86、Itanium、x64、arm、anycpu32bitpreferred 或 anycpu。默認值為 anycpu。

- 輸入文件 -
/recurse:<通配符> 根據通配符規范,包括當前目錄和子目錄下的所有文件
/reference:<別名>=<文件> 使用給定的別名從指定的程序集文件引用元數據 (縮寫: /r)
/reference:<文件列表> 從指定的程序集文件引用元數據 (縮寫: /r)
/addmole:<文件列表> 將指定的模塊鏈接到此程序集中
/link:<文件列表> 嵌入指定的互操作程序集文件中的元數據 (縮寫: /l)

- 資源 -
/win32res:<文件> 指定 Win32 資源文件(.res)
/win32icon:<文件> 對輸出使用此圖標
/win32manifest:<文件> 指定 Win32 清單文件(.xml)
/nowin32manifest 不包括默認 Win32 清單
/resource:<資源信息> 嵌入指定的資源 (縮寫: /res)
/linkresource:<資源信息> 將指定的資源鏈接到此程序集 (縮寫: /linkres)
其中 resinfo 的格式是 <file>[,<string name>[,public|private]]

- 代碼生成 -
/debug[+|-] 發出調試信息
/debug:{full|pdbonly} 指定調試類型(「full」是默認類型,可以將調試程序附加到正在運行的程序)
/optimize[+|-] 啟用優化 (縮寫: /o)

- 錯誤和警告 -
/warnaserror[+|-] 將所有警告報告為錯誤
/warnaserror[+|-]:<警告列表> 將特定警告報告為錯誤
/warn:<n> 設置警告等級(0-4) (縮寫: /w)
/nowarn:<警告列表> 禁用特定的警告消息

- 語言 -
/checked[+|-] 生成溢出檢查
/unsafe[+|-] 允許「不安全」代碼
/define:<符號列表> 定義條件編譯符號 (縮寫: /d)
/langversion:<字元串> 指定語言版本模式: ISO-1、ISO-2、3、4、5 或 Default

- 安全性 -
/delaysign[+|-] 僅使用強名稱密鑰的公共部分對程序集進行延遲簽名
/keyfile:<文件> 指定強名稱密鑰文件
/keycontainer:<字元串> 指定強名稱密鑰容器
/highentropyva[+|-] 啟用高平均信息量的 ASLR

- 雜項 -
@<文件> 有關更多選項,請閱讀響應文件
/help 顯示此用法信息 (縮寫: /?)
/nologo 取消編譯器版權信息
/noconfig 不要自動包含 CSC.RSP 文件

- 高級 -
/baseaddress:<地址> 要生成的庫的基址
/bugreport:<文件> 創建「Bug 報告」文件
/codepage:<n> 指定打開源文件時要使用的代碼頁
/utf8output 以 UTF-8 編碼格式輸出編譯器消息
/main:<類型> 指定包含入口點的類型(忽略所有其他可能的入口點) (縮寫: /m)
/fullpaths 編譯器生成完全限定路徑
/filealign:<n> 指定用於輸出文件節的對齊方式
/pdb:<文件> 指定調試信息文件名(默認值: 擴展名為 .pdb 的輸出文件名)
/errorendlocation 輸出每個錯誤的結束位置的行和列
/preferreilang 指定首選輸出語言名稱。
/nostdlib[+|-] 不引用標准庫(mscorlib.dll)
/subsystemversion:<字元串> 指定此程序集的子系統版本
/lib:<文件列表> 指定要在其中搜索引用的附加目錄
/errorreport:<字元串> 指定如何處理內部編譯器錯誤: prompt、send、queue 或 none。默認值為 queue。
/appconfig:<文件> 指定一個包含程序集綁定設置的應用程序配置文件
/moleassemblyname:<字元串> 此模塊所屬程序集的名稱

Ⅵ 【求助】如何把C編譯成dll

不過你可以寫成c++的,然後弄成dll啊
在VC下編譯器里很方便的木葉清風(站內聯系TA)你看看msdn裡面關於動態鏈接庫的編寫部分,然後照著寫一個就行了。可以用__declspec( dllexport )或者寫.def文件導出函數或者變數,dllmain函數可要也可不要(不要的時候在屬性裡面指定生產dll)magic7004(站內聯系TA)只要告訴編譯器你要生成DLL就行了,如果你的編譯器沒有這個功能,那麼換個編譯器就OK了。chengrg(站內聯系TA)做成了!用c++文件如下:#include extern "C"{
/*---------------- 計算理想氣體焓值 --------------------*/

Ⅶ c語言寫的程序怎麼樣生成.dll文件

dll製作步驟:
1.編寫dll函數實現源代碼hello.c

#include

int say_hello(char* name)
{
printf( "hello %s\n ", name);
return 1;
}

2.編寫dll函數輸出定義文件hello.def.

LIBRARY hello
EXPORTS
say_hello @1

3.編譯dll源碼,生成dll,lib文件.

3.1 新建命令行窗口
3.2 設置PATH ?? INCLUDE ?? LIB 3個環境變數.

SET PATH=K:\vcnet\vc7\bin;%PATH%
SET INCLUDE=K:\vcnet\vc7\include;%INCLUDE%
SET LIB=K:\vsnet\Vc7\lib;%LIB%

3.3 編譯hello.c

cd K:\Source\dllsample (hello.c和hello.def所在目錄)
cl /c hello.c

3.4 鏈接hello.obj,生成hello.dll,hello.lib兩個文件.

link /def:hello.def /dll hello.obj

4.測試dll函數.

4.1 編寫測試代碼 test.c

extern int say_hello(char* name);
int main(int argc,char** argv)
{
say_hello( "robbie ");
return 0;
}

4.2 編譯測試代碼test.c

cl /c test.c

4.3 鏈接test.obj和 hello.lib,生成可執行文件test.exe

link test.obj hello.lib

4.4 運行test.exe,屏幕輸出:

hello robbie

至此,一個dll構造完畢.

Ⅷ 用C語言編寫DLL

一.動態鏈接庫(dll)結構
——dll中定義有兩種函數:導出函數(export
function)和內部函數
(internal
function),導出函數可以被其他模塊調用,內部函數只能在dll內部使用。我們在用c++定製dll文件時,需要編寫的就是包含導出函數表的模塊定義文件(.def)和實現導出函數功能的c++文件。下面以sample.dll為例介紹def文件和實現文件的結構:
——1.模塊定義文件(.def)是由一個或者多個用於描述dll屬性的模塊語
句組成的文本文件,每個.def文件至少必須包含以下模塊定義語句:
第一個語句必須是library語句,指出dll的名字。
exports語句列出被導出函數的名字。
可以使用description語句描述dll的用途(此句可選)。
";"對一行進行注釋(可選)
——2.實現文件(.cpp文件為例)
——實現入口表函數的.cpp文件中,包含dll入口點處理的api函數和導出
函數的代碼。

Ⅸ 把c文件編譯成dll文件

1、Ic -->Id
2、你的jdk裝沒裝,沒裝的話找找裝上,提示NO such file or directory
裝了的話,找找你安裝的文件夾替換上

熱點內容
centosphp升級 發布:2025-03-16 02:42:04 瀏覽:52
絕地求生體驗服為什麼伺服器已滿了 發布:2025-03-16 02:42:03 瀏覽:704
伺服器電腦機房是幹嘛的 發布:2025-03-16 02:30:47 瀏覽:488
龍貝格演算法c語言 發布:2025-03-16 02:26:28 瀏覽:101
c語言字元串讀入 發布:2025-03-16 02:21:23 瀏覽:476
python爬蟲開發環境 發布:2025-03-16 02:19:55 瀏覽:626
androidondestory 發布:2025-03-16 02:12:49 瀏覽:862
軟體源碼侵權 發布:2025-03-16 02:06:54 瀏覽:287
給表添加欄位的sql 發布:2025-03-16 02:04:29 瀏覽:473
1除5演算法 發布:2025-03-16 02:02:57 瀏覽:757