c语言如何生成DLL文件

合集下载

使用CLion创建C语言动态链接库DLL文件

使用CLion创建C语言动态链接库DLL文件
运行之前需要添加环境变量。
参考
准备
配置编译环境MinGW,类似配置IDEA的jdk
配置构建环境Cmake
调试结果如下
创 建 DLL项 目
项目名称为testdll
项 目 stdll.dll
创 建 DLL使 用 项 目
使用C语言调用dll
在项目下创建lib目录,将之前生成的libtestdll.dll文件放到此目录下,设置lib搜索目录。
其实短链接只有生成和跳转还不能满足实际业务需求还需要考虑其使用场景目前短链接使用场景主要是短信内带短链接
使用 CLion创建 C语言动态链接库 DLL文件
前言
CLion是JetBrains公司一款开发C和C++的强大IDE,其公司产品还有IntelliJ IDEA,WebStorm,Pycharm等。 MinGW 的全称是:Minimalist GNU on Windows,可以看做 GCC 的 Windows 版本。 DLL 的全称为 Dynamic Link Library,动态链接库,类似java中的jar包,达到代码复用的优势。

C语言编译成dll

C语言编译成dll

C语⾔编译成dll
⾸先c语⾔在开始要加上
#ifdef __cplusplus
extern "C" {
#endif
…被导出的⽅法名称
#ifdef __cplusplus
}
#endif
不然系统会将起当做c++,转成的dll中的⽅法名称会被转义。

在实现的⽅法名称前⾯加上__declspec(dllexport)
1. Gcc:gcc –shared -o xxxx.dll xxxx.c 可以直接将.c⽂件转成dll⽂件。

在实际引⽤中,我是将所有的#include都是放在.c⽂件中的,上述的注意代码也是放在.c中的,他的头⽂件是直接抛弃掉了。

2. Vc创建⼀个c++的项⽬,⽂件-新建-新建项⽬-其他语⾔-Visual C++ - Win32 控制台应⽤程序;勾选DLL和导出符号,.c需要修改
成.cpp,右键-属性-预编译头-不使⽤预编译头,右击项⽬“重新⽣成”。

1实地使⽤过确认可以使⽤,2未尝试过但是在使⽤c++转出dll是没有问题的
在导出过程中我们可以使⽤vs⾃带⼀个⼯具来查询⽣成的dll中有那些⽅法,例如:
Vs安装路径下:C:\vs 2012\VC\bin\dumpbin.exe,可能会报⼀个缺少“mspdb110.dll”⽂件的错误,直接将安装路径下:C:\vs
2012\Common7\IDE下⾯的该⽂件复制粘贴到C:\vs 2012\VC\bin\下⾯。

⽤法是,先cd到dumpbin的路径下,dumpbin –exports xxxx.dll。

DLL文件生成方法

DLL文件生成方法
DLL 生成方法 供 c#使用
1:打开 vs2008,新建一个类库,名为 Cmdll(C++.net 语言) 2:在 Cmdll.h 中输入以下代码: extern "C" __declspec(dllexport) int SampleMethod(int i) { return i*10; } 3:编译一下,在项目的文件夹里会生成 Cmdll.dll 文件。这个就可以在 c#中调用了。 c#调用如下 using System; using System.Runtime.InteropServices; namespace ConsoleApplication1 { class Program { [DllImport("Cmdll.dll", EntryPoint = "SampleMethod")] public static extern int SampleMethod(int x); static void Main(string[] args) { Console.WriteLine("SampleMethod() returns {0}.", SampleMethod(5)); Console.Read(); } } }
C++Dll 编写入门
一、前言 自从微软推出16位的Windows操作系统起,此后每种版本的Windows操作系统 都非常依赖于动态链接库(DLL)中的函数和数据,实际上Windows操作系统中几乎所有的 内容都由DLL以一种或另外一种形式代表着,例如显示的字体和图标存储在GDI DLL中、 显示Windows桌面和处理用户的输入所需要的代码被存储在一个User DLL中、Windows 编程所需要的大量的API函数也被包含在Kernel DLL中。 在Windows操作系统中使用DLL 有很多优点, 最主要的一点是多个应用程序、 甚至是不同语言编写的应用程序可以共享一个 DLL文件,真正实现了资源"共享",大大缩小了应用程序的执行代码,更加有效的利用了内 存;使用DLL的另一个优点是DLL文件作为一个单独的程序模块,封装性、独立性好,在软 件需要升级的时候,开发人员只需要修改相应的DLL文件就可以了,而且,当DLL中的函数 改变后,只要不是参数的改变,程序代码并不需要重新编译。这在编程时十分有用,大大提 高了软件开发和维护的效率。 既然DLL那么重要, 所以搞清楚什么是DLL、 如何在Windows 操作系统中开发使用DLL是程序开发人员不得不解决的一个问题。本文针对这些问题,通过 一个简单的例子,即在一个DLL中实现比较最大、最小整数这两个简单函数,全面地解析了 在Visual C++编译环境下编程实现DLL的过程,文章中所用到的程序代码在Windows98 系统、Visual C++6.0编译环境下通过。 二、DLL的概念 DLL是建立在客户/服务器通信 的概念上,包含若干函数、类或资源的库文件,函数和数据被存储在一个DLL(服务器)上 并由一个或多个客户导出而使用,这些客户可以是应用程序或者是其它的DLL。DLL库不同 于静态库, 在静态库情况下, 函数和数据被编译进一个二进制文件 (通常扩展名为*.LIB) , Visual C++的编译器在处理程序代码时将从静态库中恢复这些函数和数据并把他们和应 用程序中的其他模块组合在一起生成可执行文件。这个过程称为"静态链接",此时因为应用 程序所需的全部内容都是从库中复制了出来, 所以静态库本身并不需要与可执行文件一起发 行。 在动态库的情况下,有两个文件,一个是引入库(.LIB)文件,一个是DLL文件,引 入库文件包含被DLL导出的函数的名称和位置,DLL包含实际的函数和数据,应用程序使用 LIB文件链接到所需要使用的DLL文件,库中的函数和数据并不复制到可执行文件中,因此 在应用程序的可执行文件中,存放的不是被调用的函数代码,而是DLL中所要调用的函数的 内存地址,这样当一个或多个应用程序运行是再把程序代码和被调用的函数代码链接起来, 从而节省了内存资源。从上面的说明可以看出,DLL和.LIB文件必须随应用程序一起发行, 否则应用程序将会产生错误。 微软的Visual C++支持三种DLL, 它们分别是Non-MFC Dll (非MFC动态库) 、 Regular Dll (常规DLL) 、 Extension Dll (扩展DLL) 。 Non-MFC DLL 指的是不用MFC的类库结构,直接用C语言写的DLL,其导出的函数是标准的C接口,能被 非MFC或MFC编写的应用程序所调用。Regular DLL:和下述的Extension Dlls一样,是用 MFC类库编写的,它的一个明 显的特点是在源文件里有一个继承 CWinApp 的类(注意:此类 DLL 虽然从 CWinApp 派生, 但没有消息循环),被导出的函数是 C 函数、C++类或者 C++成员函数(注意不要把术语 C++ 类与 MFC 的微软基础 C++类相混淆) ,调用常规 DLL 的应用程序不必是 MFC 应用程序,只要 是能调用类 C 函数的应用程序就可以, 它们可以是在 Visual C++、 Dephi、 Visual Basic、 Borland C 等编译环境下利用 DLL 开发应用程序。 常规 DLL 又可细分成静态链接到 MFC 和动态链接 到 MFC 上的,这两种常规 DLL 的区别将在下面介绍。与常规 DLL 相比,使用扩展 DLL 用于 导出增强 MFC 基础类的函数或子类,用这种类型的动态链接库,可以用来输出一个从 MFC 所继承下来的类。 扩展 DLL 是使用 MFC 的动态链接版本所创建的,并且它只被用 MFC 类 库所编写的应用程序所调用。例如你已经创建了一个从 MFC 的 CtoolBar 类的派生类用于创 建一个新的工具栏, 为了导出这个类, 你必须把它放到一个 MFC 扩展的 DLL 中。 扩展 DLL 和

以MELP为例子讲解C语言生成dll的方法

以MELP为例子讲解C语言生成dll的方法

1、搜索下载解压缩melp的C语言源程序http://health.tau.ac.il/Communication%20Disorders/noam/speech/melp/Download/Download.htm2、打开Visual Studio 2010,新建一个工程接下来弹出如下界面,点击OK选择Next选择Application type DLL,最后点击Finish3、建立MELP工程,首先删除不需要的MELP.cpp文件,也可以不删除的。

打开该工程所在的文件夹弹出如下界面复制第一步下载解压缩的MELP的源代码到本工程的目录。

如下图。

4、添加上一步的文件到工程弹出如下界面,全选所有的文件,然后放弃图中标示的那三项,点击Add添加完毕后就会如下图所示了,然后双击打开melp.h文件,和melp.c文件,这是我们需要更改的两个程序,其他都不需要改变的。

5、对melp.h文件的添加,打开melp.h,把如下程序写入到原始文件的最下面#ifndef LIB_H#define LIB_Hextern_decl spec(dllexport) void cmd_melp(int argc, char **argv);extern_decl spec(dllexport) void melp_encoder_ini();extern_decl spec(dllexport) void melp_encoder(short speechIn720[],char result27[]);extern_decl spec(dllexport) void melp_encoder720s(short speechIn720s[],int times,char result27s[]);extern_decl spec(dllexport) void melp_decoder_ini(); extern_decl spec(dllexport) void melp_decoder( char inChar27[],short *speechOut720);extern_decl spec(dllexport) void melp_decoder27s( char inChar27s[],int times,short *speechOut720s);#endif添加完毕后,如下图所示关于上述文件添加的原因,可以参见如下的博客/bubifengyun/blog/96252 6、对melp.c文件的修改和添加先修改melp.h的位置添加melp.h文件中声明函数的函数体。

c语言如何生成DLL文件

c语言如何生成DLL文件

DLLIMPORT void HelloWorld (void);
#endif /* _DLL_H_ */
C 文件 dllmain.c #include t;
DLLIMPORT void HelloWorld () {
MessageBox (0, "Hello World from DLL!\n", "Hi", MB_ICONINFORMATION); }
/*过程要带入的参数*/
LibHandle = LoadLibrary(dllbuf); /*载入 dll*/
FUNCADD = (MYFUNC)GetProcAddress(
LibHandle, sysbuf); /*获取函数 sysbuf 的地址*/
(FUNCADD) (NULL,downfile,savefile,0,NULL);
if (hDLL == NULL) hDLL=LoadLibrary("hello.dll"); //加载 DLL
hello = (func)GetProcAddress(hDLL,"HelloWorld"); //获取函数指针 hello(); FreeLibrary(hDLL); //释放 DLL return 0; }
开发环境是 DEV C++,采用 C 语言编写 创建一个 DLL 项目,项目名称 hello,DLL 编写采用的是 DEV C++中的示例代码
头文件 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 */

DLL文件的生成和引用方法

DLL文件的生成和引用方法

一、动态链接库什么是动态链接库?DLL三个字母对于你来说一定很熟悉吧,它是Dynamic Link Library 的缩写形式,动态链接库(DLL) 是作为共享函数库的可执行文件。

动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。

函数的可执行代码位于一个DLL 中,该DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。

DLL 还有助于共享数据和资源。

多个应用程序可同时访问内存中单个DLL 副本的内容。

和大多数程序员一样,你一定很使用过DLL吧。

也曾感受到它的带给你程序设计和编码上的好错吧今天我想和大家探讨一个主题:如何在C#创建和调用DLL(动态链接库), 其实在很大意义上而讲,DLL让我更灵活的组织编写我们的应用程序,作为软件设计者,可一个根据它来达到很高的代码重用效果。

下面我来介绍一下在C#中如何创建和调用DLL。

二、准备工作我们需要对我们接下来要做的事情做个简单的介绍,在本文我们将利用C#语言创建一个名为MyDLL.DLL的动态链接库,在这个动态链接库文件中我们将提供两个功能一个是对两个参数交换他们的值,另一个功能是求两个参数的最大公约数。

然后创建一个应用程序使用这个DLL。

运行并输出结果。

1、MySwap.csnamespace MyMethods{public class SwapClass{public static bool Swap(ref long i,ref long j){i = i+j;j = i-j;i = i-j;return true;}}}2、MyMaxCD.csnamespace MyMethods{public class MaxCDClass{public static long MaxCD(long i, long j){long a,b,temp;if(i>j){a = i;b = j;}else{b = i;a = j;}temp = a % b;while(temp!=0){a = b;b = temp;temp = a % b;}return b;}}}需要注意的是:我们在制作这两个文件的时候可以用Visual 或者其他的文本编辑器,就算是记事本也可以。

dll文件生成方法

dll文件生成方法

dll文件生成方法
DLL(动态链接库)文件的生成可以通过多种方式,其中一种简单的方法是通过 Microsoft Visual Studio 这样的集成开发环境(IDE)进行。

下面是详细的步骤:
1. 创建环境:首先,确保你已经安装了 Microsoft Visual Studio。

其他版本的 Visual Studio(如 Visual Studio 2022)也可以,但步骤大致相同。

2. 创建 DLL 项目:
打开 Visual Studio。

选择“新建项目”。

在项目模板中选择“DLL”。

输入 DLL 的名称,然后点击“确定”。

3. 编写 DLL 代码:在创建的项目中,你可以开始编写 DLL 的代码。

一个简单的 DLL 可能包含一个导出函数。

4. 编译 DLL:
在 Visual Studio 中,点击“生成”菜单,然后选择“生成解决方案”或直接按 F7 键。

5. 检查生成的 DLL:编译成功后,可以在项目文件夹的“Debug”或“Release”子文件夹下找到生成的 DLL 文件。

6. 测试 DLL:为了测试 DLL 是否正常工作,你可以创建一个新的Windows 应用程序项目,并在其中调用你的 DLL。

7. 分发 DLL:如果你想将 DLL 分发给其他人,只需将 DLL 文件和任何依赖项一起打包即可。

请注意,这只是生成 DLL 的其中一种方法。

还有其他工具和平台(如 Linux)可以使用,具体取决于你的需求和环境。

c语言dll写法

c语言dll写法

c语言dll写法
在C语言中,编写DLL(动态链接库)的基本步骤如下:
1. 定义导出函数或变量:使用__declspec(dllexport)关键字将需要导出的函数或变量声明为导出符号。

例如:
```c
__declspec(dllexport) void MyFunction()
{
// 函数实现
}
```
2. 编译源代码:使用C编译器将源代码编译为目标文件。

例如,使用GCC 编译器可以使用以下命令:
```shell
gcc -c -DBUILD_DLL
```
这将生成一个名为的目标文件。

3. 创建DLL项目:使用链接器将目标文件链接为DLL。

例如,使用GCC编译器可以使用以下命令:
```shell
gcc -shared -o
```
这将生成一个名为的DLL文件。

4. 使用DLL:在其他C语言程序中,使用__declspec(dllimport)关键字导
入DLL中的导出符号。

例如:
```c
__declspec(dllimport) void MyFunction();
```
然后在程序中使用该函数或变量即可。

注意,在使用DLL时需要确保DLL
文件与应用程序位于同一目录中,或者在系统路径中添加DLL文件的路径。

以上是编写C语言DLL的基本步骤。

需要注意的是,具体的实现方式可能
会因编译器和操作系统而有所不同。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

{ 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; }
还有要注意的在.def 文件中指定输出的函数,编译生成了 hello.dll 文件
DLL 调用部分 dllcall.c #include <windows.h> #include <stdio.h> #include <stdlib.h>
HINSTANCE hDLL; //定义 DLL 包柄 typedef void ( *func)(); //定义函数指针原型 func hello; //定义函数指针 int main() {
BOOL APIENTRY DllMain (HINSTANCE hInst /* Library instance handle. */ ,
DWORD reason
/* Reason this function is being called. */ ,
LPVOID reserved /* Not used. */ )来自/*过程要带入的参数*/
LibHandle = LoadLibrary(dllbuf); /*载入 dll*/
FUNCADD = (MYFUNC)GetProcAddress(
LibHandle, sysbuf); /*获取函数 sysbuf 的地址*/
(FUNCADD) (NULL,downfile,savefile,0,NULL);
开发环境是 DEV C++,采用 C 语言编写 创建一个 DLL 项目,项目名称 hello,DLL 编写采用的是 DEV C++中的示例代码
头文件 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 */
if (hDLL == NULL) hDLL=LoadLibrary("hello.dll"); //加载 DLL
hello = (func)GetProcAddress(hDLL,"HelloWorld"); //获取函数指针 hello(); FreeLibrary(hDLL); //释放 DLL return 0; }
/*FUNCADD 就 相 当 于 函 数
URLDownloadToFileA 后面是参数*/
}
#include <WINDOWS.H> #include <WINBASE.H> typedef int (*MYFUNC)(PVOID,char*,char*,int,char*); /* 函数原型*/ int main() {
HINSTANCE LibHandle; MYFUNC FUNCADD; char dllbuf[] = "UrlMon.dll"; char sysbuf[] = "URLDownloadToFileA"; /*函数名*/ char *downfile = "/img/logo-yy.gif"; char *savefile = "f:\\c\\.gif";编译执行
/*c 语言调用 dll 里的函数-例子 2 之文件下载 都 5 点了,还是睡不着,躺在床上 想着该做点撒,于是乎,开始查找了下资料,大致弄清楚了 c 里怎么调用 dll 里的函数,就写了个文件下载的例子,很简单,调用系统本身的 UrlMon.dll 里的 URLDownloadToFileA 函数,之前的例子一是过程的调用,现在这个是 函数的调用,都很简单。*/
DLLIMPORT void HelloWorld (void);
#endif /* _DLL_H_ */
C 文件 dllmain.c #include <stdio.h> #include <stdlib.h>
DLLIMPORT void HelloWorld () {
MessageBox (0, "Hello World from DLL!\n", "Hi", MB_ICONINFORMATION); }
相关文档
最新文档