用VS 如何由源代码生成DLL文件
1:创建DLL工程
文件-新建-项目-visual c++-win32-win32控制台应用程序(win32项目也可以)
填写项目名称MyDLL-确定-下一步-DLL(附加选项 对空项目打钩)-完成。
到这里DLL工程就创建完毕了,下面新建两个文件MyDLL.cpp和MyDLL.h。
MyDLL.cpp内容如下:
1 #include
2 using namespace std;
3 #include "MyDLL.h"
4
5 int Add(int a,int b)
6 {
7 return a+b;
8 }
MyDLL.h内容如下:
1 #pragma once
2
3 extern "C" __declspec(dllexport) int Add(int a,int b);
点击生成Bulid --Bulid MyDLL,dll文件就生成了,vs2008不能直接生成lib文件,这个时候就需要我们在建立dll工程的时候 再新建一个def文件,默认生成然后重新生成就能够得到lib文件了,但可以通过修改工程属性里面的general-project default-configure type修改为lib,就可以生成lib文件。
注意:如果在已存在的工程上创建dll或者lib,不需要修改工程,只要把工程属性里面的general-project default-configure type修改为lib或者dll,就可以生成lib文件或者dll文件了
在C++程序中使用刚才生成的DLL文件步骤:
新建一个win32 控制台工程,取名testMyDLL,新建两个文件:testMyDLL.cpp和testMyDLL.h,
首先需要 隐式链接采用静态加载的方式,比较简单,需要.h、.lib、.dll三件套。新建“控制台应用程序”或“空项目”。配置如下:(这一点非常重要)
项目-属性-配置属性-VC++ 目录- 在“包含目录”里添加头文件MyDLL.h所在的目录
项目-属性-配置属性-VC++ 目录- 在“库目录”里添加头文件MyDLL.lib所在的目录
项目-属性-配置属性-链接器-输入- 在“附加依赖项”里添加“MyDLL.lib”(若有多个 lib 则以空格隔开)
testMyDLL.cpp内容如下:
#include "testMyDLL.h"
#pragma comment(lib,"..\\debug\\MyDLL.lib")//可以写成绝对路径,但是路径一定要用\\来指明,即:J:\\Pr//ograms\\C++\\Practice\\DLLTEST\\DLLtest\\Debug\\MyDLL.lib"#include
using namespace std;
int main()
{
int a =3;
int b =2;
coutAdd(a,b)endl;
getchar();
}
testMyDLL.h内容如下
#pragma once
extern "C" _declspec(dllexport) int Add(int a,int b);
现在可以编译通过了,但是程序运行就报错,还需要将MyDLL.dll复制到当前项目生成的可执行文件所在的目录。(这一点非常重要)
这里需要注意testMyDLL.cpp文件中调用lib的这句话:
#pragma comment(lib,"..\\debug\\MyDLL.lib")
这里需要指明lib所在的文件夹,当然我们也可以在生成dll的MyDLL工程中,指定lib和dll文件的输出路径,直接到testMyDLL工程下。
注意:如果只有dll文件,那么必须在程序里面调用LoadLibrary()函数才能使用,如果有lib文件,那么有两种方式可以马上进行调用
根据dll生成lib的方法
设置VS2015运行环境
在开始菜单打开Visual Studio 2015\Visual Studio Tools\Windows Desktop Command Prompts\VS2015 x86 x64 Cross Tools Command Prompt
切换到DLL所在目录
在命令窗口输入 cd /d "你的DLL目录"回车切换到对应目录。
生成DEF文件
dumpbin /exports zmotion_x64.dll zmotion_x64.def
生成的文件如下:
Microsoft (R) COFF/PE Dumper Version 14.00.24210.0
Copyright (C) Microsoft Corporation. All rights reserved.
Dump of file zmotion_x64.dll
File Type: DLL
Section contains the following exports for zmotion.dll
00000000 characteristics
54101CA1 time date stamp Wed Sep 10 17:40:49 2014
0.00 version
1 ordinal base
136 number of functions
136 number of names
ordinal hint RVA name
134 0 0000CA20 DllCanUnloadNow
135 1 0000C9C0 DllGetClassObject
136 2 0000CA60 DllRegisterServer
1 3 00003FB0 ZMC_BreakAdd
2 4 00004160 ZMC_BreakClear
3 5 00004090 ZMC_BreakDel
4 6 00001EB0 ZMC_CalStringHash
5 7 000039C0 ZMC_CancelOnline
6 8 00001F80 ZMC_Check3File
7 9 00002C50 ZMC_CheckFirmWare
8 A 000034E0 ZMC_CheckProgramSyntax
9 B 00003190 ZMC_ClearLog
10 C 00001450 ZMC_Close
11 D 000020B0 ZMC_Delete3File
12 E 00003300 ZMC_DeleteFile
13 F 000016F0 ZMC_DirectCommand
14 10 00003260 ZMC_DownFile
15 11 00002DA0 ZMC_DownFirmWare
16 12 00003280 ZMC_DownMemFile
17 13 000018A0 ZMC_DownMemZar
18 14 000019E0 ZMC_DownMemZarToRamAndRun
19 15 000017A0 ZMC_DownZar
20 16 000018D0 ZMC_DownZarToRamAndRun
21 17 00003E80 ZMC_EnumArray
22 18 00003C80 ZMC_EnumChildCard
23 19 00003E80 ZMC_EnumLabel
24 1A 00003D60 ZMC_EnumLocal
25 1B 00003E80 ZMC_EnumPara
26 1C 00003E80 ZMC_EnumSub
27 1D 00003E80 ZMC_EnumVar
28 1E 00004530 ZMC_Execute
29 1F 00001650 ZMC_ExecuteGetReceive
30 20 000016C0 ZMC_ExecuteGetRemainBuffSpace
31 21 00004430 ZMC_ExecuteNoAck
32 22 00001610 ZMC_ExecuteWaitDown
33 23 00004210 ZMC_FastOpen
34 24 00002020 ZMC_FindFirst3File
35 25 00003200 ZMC_FindFirstFile
36 26 00002050 ZMC_FindNext3File
37 27 00003230 ZMC_FindNextFile
38 28 00002160 ZMC_FlashReadf
39 29 000020F0 ZMC_FlashWritef
40 2A 000026F0 ZMC_GetAIn
41 2B 000034F0 ZMC_GetAxisFeatures
42 2C 000025C0 ZMC_GetAxisStates
43 2D 000015E0 ZMC_GetAxises
44 2E 00002270 ZMC_GetChipId
45 2F 00002230 ZMC_GetClientId
46 30 00001570 ZMC_GetConnectString
47 31 00001540 ZMC_GetConnectType
48 32 00002F40 ZMC_GetControllerIDDate
49 33 00002080 ZMC_GetCur3File
50 34 00002200 ZMC_GetCurIpAddr
51 35 000027A0 ZMC_GetDaOut
52 36 000034B0 ZMC_GetErrcodeDescription
53 37 00002250 ZMC_GetError
54 38 00003BD0 ZMC_GetFileState
55 39 00002260 ZMC_GetHardId
56 3A 00002480 ZMC_GetIn
57 3B 000029A0 ZMC_GetInAll
58 3C 000031D0 ZMC_GetMac
59 3D 000034E0 ZMC_GetMaxPciCards
60 3E 00002A50 ZMC_GetOutAll
61 3F 00002520 ZMC_GetOutput
62 40 00001510 ZMC_GetProgress
63 41 00002240 ZMC_GetSoftId
64 42 00002280 ZMC_GetSoftVersion
65 43 000015A0 ZMC_GetState
66 44 000015B0 ZMC_GetStopPauseTaskid
67 45 000037D0 ZMC_GetStringType
68 46 00003510 ZMC_GetSysSpecification
69 47 00003AE0 ZMC_GetTaskStackState
70 48 000039D0 ZMC_GetTaskState
71 49 000014D0 ZMC_GetTimeOut
72 4A 00001EA0 ZMC_GetZlibGlobalDefine
73 4B 00003F20 ZMC_GlobalArrayGet
74 4C 00003E90 ZMC_GlobalVarGet
75 4D 00002BC0 ZMC_JumpApp
76 4E 00002BD0 ZMC_JumpZbios
77 4F 00004720 ZMC_Lock
78 50 00003120 ZMC_LowFormatNand
79 51 00001C90 ZMC_MakeOneFileZpj
80 52 00001E10 ZMC_MakeRealZpj
81 53 00001E80 ZMC_MakeRealZpjMem
83 54 00001760 ZMC_MakeZar
82 55 00001780 ZMC_MakeZar2
85 56 00001BB0 ZMC_MakeZarAndDown
84 57 00001C20 ZMC_MakeZarAndDown2
87 58 00001AD0 ZMC_MakeZarAndRamRun
86 59 00001B40 ZMC_MakeZarAndRamRun2
88 5A 00001E90 ZMC_MakeZlib
89 5B 00003390 ZMC_Modbus_Get0x
90 5C 000033F0 ZMC_Modbus_Get4x
91 5D 00003330 ZMC_Modbus_Set0x
92 5E 00003450 ZMC_Modbus_Set4x
93 5F 00003E80 ZMC_ModifyLocal
94 60 00004170 ZMC_Open
95 61 000042C0 ZMC_OpenCom
97 62 00004390 ZMC_OpenEth
96 63 000043A0 ZMC_OpenEth2
98 64 00001100 ZMC_OpenPci
99 65 00001F60 ZMC_Pause
100 66 00004320 ZMC_PeakCom
101 67 000036E0 ZMC_ReadMessage
102 68 000020E0 ZMC_RemoveAll3Files
103 69 00003140 ZMC_ResetController
104 6A 00001F50 ZMC_Resume
105 6B 00003130 ZMC_ReturnDefault
106 6C 00001F00 ZMC_RunZarFile
107 6D 000043C0 ZMC_SearchAndOpenCom
108 6E 00001110 ZMC_SearchAndOpenEth
109 6F 00001340 ZMC_SearchEth
110 70 00002340 ZMC_SetAxisEnable
111 71 000010E0 ZMC_SetComDefaultBaud
112 72 00003040 ZMC_SetControllerIDDate
113 73 00002850 ZMC_SetDaOut
114 74 000031A0 ZMC_SetMac
115 75 000028F0 ZMC_SetOutAll
116 76 000023E0 ZMC_SetOutput
117 77 00001490 ZMC_SetTimeOut
118 78 00004920 ZMC_Signal_BasicP
119 79 00004940 ZMC_Signal_BasicV
120 7A 00002BB0 ZMC_StartHardwareTest
121 7B 00003900 ZMC_StepRun
122 7C 00001F70 ZMC_Stop
123 7D 00002BE0 ZMC_TempModBaud
124 7E 00002B00 ZMC_TestSoftware
125 7F 000047C0 ZMC_UnLock
126 80 00001ED0 ZMC_UpCurZpjToMem
127 81 000032B0 ZMC_UpFile
128 82 000032D0 ZMC_UpFileToMem
129 83 00003150 ZMC_UpLog
130 84 00003160 ZMC_UpLogToMem
131 85 00003E80 ZMC_UpZar
132 86 00003E80 ZMC_UpZarToMem
133 87 00003E80 ZMC_UpZarToProject
Summary
18000 .data
14000 .pdata
83000 .rdata
13000 .reloc
3000 .rsrc
176000 .text
1000 data
1000 text
修改def文件为标准def格式
将zmotion_x64.def修改保存如下文件格式:
LIBRARY
EXPORTS
ZMC_BreakAdd
ZMC_BreakClear
ZMC_BreakDel
ZMC_CalStringHash
ZMC_CancelOnline
ZMC_Check3File
ZMC_CheckFirmWare
ZMC_CheckProgramSyntax
ZMC_ClearLog
ZMC_Close
ZMC_Delete3File
ZMC_DeleteFile
ZMC_DirectCommand
ZMC_DownFile
ZMC_DownFirmWare
ZMC_DownMemFile
ZMC_DownMemZar
ZMC_DownMemZarToRamAndRun
ZMC_DownZar
ZMC_DownZarToRamAndRun
ZMC_EnumArray
ZMC_EnumChildCard
ZMC_EnumLabel
ZMC_EnumLocal
ZMC_EnumPara
ZMC_EnumSub
ZMC_EnumVar
ZMC_Execute
ZMC_ExecuteGetReceive
ZMC_ExecuteGetRemainBuffSpace
ZMC_ExecuteNoAck
ZMC_ExecuteWaitDown
ZMC_FastOpen
ZMC_FindFirst3File
ZMC_FindFirstFile
ZMC_FindNext3File
ZMC_FindNextFile
ZMC_FlashReadf
ZMC_FlashWritef
ZMC_GetAIn
ZMC_GetAxisFeatures
ZMC_GetAxisStates
ZMC_GetAxises
ZMC_GetChipId
ZMC_GetClientId
ZMC_GetConnectString
ZMC_GetConnectType
ZMC_GetControllerIDDate
ZMC_GetCur3File
ZMC_GetCurIpAddr
ZMC_GetDaOut
ZMC_GetErrcodeDescription
ZMC_GetError
ZMC_GetFileState
ZMC_GetHardId
ZMC_GetIn
ZMC_GetInAll
ZMC_GetMac
ZMC_GetMaxPciCards
ZMC_GetOutAll
ZMC_GetOutput
ZMC_GetProgress
ZMC_GetSoftId
ZMC_GetSoftVersion
ZMC_GetState
ZMC_GetStopPauseTaskid
ZMC_GetStringType
ZMC_GetSysSpecification
ZMC_GetTaskStackState
ZMC_GetTaskState
ZMC_GetTimeOut
ZMC_GetZlibGlobalDefine
ZMC_GlobalArrayGet
ZMC_GlobalVarGet
ZMC_JumpApp
ZMC_JumpZbios
ZMC_Lock
ZMC_LowFormatNand
ZMC_MakeOneFileZpj
ZMC_MakeRealZpj
ZMC_MakeRealZpjMem
ZMC_MakeZar
ZMC_MakeZar2
ZMC_MakeZarAndDown
ZMC_MakeZarAndDown2
ZMC_MakeZarAndRamRun
ZMC_MakeZarAndRamRun2
ZMC_MakeZlib
ZMC_Modbus_Get0x
ZMC_Modbus_Get4x
ZMC_Modbus_Set0x
ZMC_Modbus_Set4x
ZMC_ModifyLocal
ZMC_Open
ZMC_OpenCom
ZMC_OpenEth
ZMC_OpenEth2
ZMC_OpenPci
ZMC_Pause
ZMC_PeakCom
ZMC_ReadMessage
ZMC_RemoveAll3Files
ZMC_ResetController
ZMC_Resume
ZMC_ReturnDefault
ZMC_RunZarFile
ZMC_SearchAndOpenCom
ZMC_SearchAndOpenEth
ZMC_SearchEth
ZMC_SetAxisEnable
ZMC_SetComDefaultBaud
ZMC_SetControllerIDDate
ZMC_SetDaOut
ZMC_SetMac
ZMC_SetOutAll
ZMC_SetOutput
ZMC_SetTimeOut
ZMC_Signal_BasicP
ZMC_Signal_BasicV
ZMC_StartHardwareTest
ZMC_StepRun
ZMC_Stop
ZMC_TempModBaud
ZMC_TestSoftware
ZMC_UnLock
ZMC_UpCurZpjToMem
ZMC_UpFile
ZMC_UpFileToMem
ZMC_UpLog
ZMC_UpLogToMem
ZMC_UpZar
ZMC_UpZarToMem
ZMC_UpZarToProject
生成LIB文件
lib /def:zmotion_x64.def /machine:x64 /out:zmotion_x64.lib
原文链接:
vs2012生成动态库的时候,为什么不能生成lib文件
原因可能有三个:
1)在Settings-Link中的General选项页中,选中了“Doesn't produce.LIB”复选框。
2)整个动态链接库中没有导出的函数或类。
3)所有导出函数的实现均写在在头文件中。
自己检测一下。 如果实在找不到原因,可以参考如下两种方法
1、使用LoadLibrary加载DLL文件,通过GetProcAddress()来获取函数来执行。为了方便,还可以把这两个函数写成一个类。。方便写源码。
2、使用vc工具自己 手动生成
1、在命令行执行: dumpbin /exports yourdll.dll yourdll.def
2、编辑 yourdll.def 文件,使之格式与.def文件格式一致。比如:
EXPORTS; fn1; fn2;
3、在命令行执行:
lib /def:yourdll.def /machine:i386 /out:yourdll.lib
如何在vs2013下添加.lib文件
1、添加工程的头文件目录:工程-属性-配置属性-c/c++-常规-附加包含目录:加上头文件存放目录。
2、添加文件引用的lib静态库路径:工程-属性-配置属性-链接器-常规-附加库目录:加上lib文件存放目录。
然后添加工程引用的lib文件名:工程-属性-配置属性-链接器-输入-附加依赖项:加上lib文件名。
3、添加工程引用的dll动态库:把引用的dll放到工程的可执行文件所在的目录下。