动态链接库(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包,达到代码复用的优势。
静态库和动态库编译

静态库和动态库编译静态库和动态库是编程中常用的两种库文件形式,本文将介绍它们的编译过程和使用方法。
1. 静态库编译静态库是一种在编译时被链接到程序中的库文件,它包含了程序所依赖的所有函数和数据结构,因此程序在运行时不需要再加载库文件。
静态库的编译过程包括以下步骤:(1)创建一个或多个源文件,使用编译器将它们编译成目标文件(.o 或 .obj)。
(2)将多个目标文件打包成一个静态库文件,通常使用 ar 工具完成此操作。
例如,在 Linux 系统下,可以使用以下命令创建名为 libfoo.a 的静态库文件:$ ar rcs libfoo.a foo1.o foo2.o ...其中,rcs 参数分别表示创建、向库文件中添加目标文件和生成索引表。
(3)在编译器中使用静态库,需要将其链接到目标程序中。
在Linux 系统下,可以使用以下命令编译名为 main.c 的源文件和名为libfoo.a 的静态库文件:$ gcc -o main main.c -L. -lfoo其中,-L 参数指定库文件搜索路径,. 表示当前目录;-l 参数指定链接库文件,实际上是将其前缀 lib 和后缀 .a 去掉,即 foo。
2. 动态库编译动态库是一种在程序运行时动态加载的库文件,它只包含程序所需要的部分函数和数据结构,因此可以减小程序的尺寸和加载时间。
动态库的编译过程包括以下步骤:(1)创建一个或多个源文件,使用编译器将它们编译成目标文件。
(2)将多个目标文件打包成一个共享库文件,通常使用 ld 或链接器完成此操作。
例如,在 Linux 系统下,可以使用以下命令创建名为 libfoo.so 的动态库文件:$ gcc -shared -o libfoo.so foo1.o foo2.o ...其中,-shared 参数表示生成共享库文件。
(3)在编译器中使用动态库,需要将其链接到目标程序中。
在Linux 系统下,可以使用以下命令编译名为 main.c 的源文件和名为libfoo.so 的动态库文件:$ gcc -o main main.c -L. -lfoo其中,-L 和 -l 参数的含义同静态库。
MFC下DLL编程(图解)

MFC 下DLL 编程(图解)DLL (Dynamic Link Library ,动态链接库)是微软公司为Windows 和OS/2操作系统设计一种供应用程序在运行时调用的共享函数库。
DLL 是应用程序的一种扩展,也是软件共享和重用的传统方法。
DLL 除了可同时被多个应用程序共享外,还可以在不改变调用接口(从而不需修改使用它的应用程序)的情况下,改进和升级里面的库函数。
而且DLL 与编写它的语言无关,例如,用VC 生成的规则DLL ,可以被VB 、Delphi 等生成的应用程序使用。
DLL 可以用多种语言和工具编写,我们这里只介绍如何使用MFC 来编写和使用DLL 。
相关说明文档位于MSDN 帮助的“目录\开发工具和语言\Visual Studio\Visual C++\常见编程方法\DLL\”中。
8.1 基础本节先讨论DLL 与静态库的区别,然后列出几种适合放置DLL 的目录,最后介绍MFC DLL 的三种类型。
8.1.1 DLL 与静态链接库静态链接库Lib (Static Link Library ),是在编译的链接阶段将库函数嵌入到应用程序的内部。
如果系统中运行的多个应用程序都包含所用到的公共库函数,则必然造成很大的浪费。
这样即增加了链接器的负担,也增大了可执行程序的大小,还加大了内存的消耗。
Lib 的好处是应用程序可以独立运行,而不需要在操作系统中另外安装对应的DLL 。
而DLL 采用动态链接,对公用的库函数,系统只有一个拷贝(一般是位于系统目录的*.DLL 文件),而且只有在应用程序真正调用时,才加载到内存。
在内存中的库函数,也只有一个拷贝,可供所有运行的程序调用。
当再也没有程序需要调用它时,系统会自动将其卸载,并释放其所占用的内存空间。
参见图8-1。
图8-1 静态库函数与动态链接库的区别DLL 的缺点是应用程序不能独立运行,需要在操作系统中另外安装对应的DLL 。
例如,如果你的MFC 项目被设置成“在共享DLL 中使用MFC ”的,则虽然生成的可执行程序很使用静态库函数使用动态链接库小,但是在其他没有安装Visual C++(运行环境)的机器上是不能直接运行的,需要另外安装MFC的动态链接库(如mfc90.dll)。
Vs2010编译程序成DLL动态链接库并引用

Vs2010编译程序成DLL文件并引用(限C#)
1、创建新C#控制台应用程序,项目命名createBll,打开Program.cs重命名为TestA(可以不重命名)并修改代码,如图:
写好后,可以写其它的类.cs文件
2、完成后,点击菜单栏的“项目”,下拉单选择“createDll属性”,打开如图窗口
在输出类型选择“类库”,然后关掉该窗口,生成解决方案,即生成了creatBll.dll文件,在项目下createBll\createBll\bin\Debug\createBll.dll目录下。
3、引用Dll文件,新建项目referenceDll,把上面生成的createBll.dll文件复制粘贴到新项目下Debug文件夹下面
4、在referenceDll项目解决方案处的引用点击右键,弹出窗口
浏览标签下,打开referenceDll项目下Debug文件,找到刚才复制过来的createBll.dll 文件,单击确定即可引用。
5、双击引用下的createBll打开对象浏览器,展开可以看的createBll.dll文件里封装的方法TestA
6、编写Program里的相应代码
先引用createBll,然后代码如图,即可调用dll里的方法。
VC++ 6.0如何创建与调用动态链接库

VC++ 6.0如何创建与调用动态链接库9分出处:2345软件大全时间:2011-06-29 人气:14255核心提示:静态链接库:lib中的指令被直接包含在最终生成的EXE文件中。
1.静态链接库与动态链接库区别:静态链接库:lib中的指令被直接包含在最终生成的EXE文件中。
动态链接库:dll不必被包含在最终的EXE中,EXE文件执行时可以动态地引用和卸载DLL文件。
同时,静态链接库中不能再包含其他的动态链接库或静态库,而动态链接库中可以包含其他的动态或静态库。
2.VC++支持的DLL:DLL的编制与具体的编程语言及编译器无关,动态链接库随处可见,VC++支持三种DLL:非MFC动态库、MFC规则DLL和MFC扩展DLL。
DLL导出函数(或变量、类)可供应用程序调用;DLL内部函数只能在DLL程序内使用,应用程序无法调用它们。
3.导出函数的声明方式:一种在函数声明类型和函数名之间加上“_declspec(dllexport)”。
另外一种采用模块定义(.def)文件声明,需要在库工程中添加模块文件,格式如下:LIBRARY 库工程名称EXPORTS 导出函数名4.DLL的调用方式:一种静态调用,由编译系统完成对DLL的加载和应用程序结束时DLL的卸载。
另外一种动态调用,由编程者用API函数加载和卸载DLL(DLL加载—DLL函数地址获取—DLL释放)方式。
5.所有库工程编译时必须Release方式:Build—set active configuration—选择库工程的release方式6.示例:一、函数----创建动态链接库(MFC规则DLL)1. New--projects--MFC AppWizard(dll)--Regular DLL using shared MFC DLL //取名为MFC_dll2. def文件中添加:函数名(Add_new)3. h文件中添加:外部函数声明//求和函数,函数名为Add_newextern "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--ok6. 生成7. 根目录下release文件夹中dll,lib与根目录下h文件即为所需二、函数----调用动态链接库(把MFC_dll.dll和MFC_dll.lib拷到工程所在目录)//静态调用(.h可以写到.cpp文件中)1. new--projects--win32 console application--an empty project2. 添加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_Hextern int dllGlobalVar;#endif3. 添加 sample.cpp#include "sample.h"#include <windows.h>int dllGlobalVar;bool APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpRese rved)//windows在加载DLL时,需要一个入口函数,就如同控制台或DOS程序需要main函数、win32程序需要winmain函数一样。
如何在vc中使用mingw编译出来的动态库和静态库

如何在vc中使⽤mingw编译出来的动态库和静态库
mingw编译出来的静态库后缀名为.a,编译出来的动态库的导⼊库后缀名为.dll.a,⽽在windows下后缀名为.lib的库可能是静态库也可能是动态库的导⼊库。
mingw编译出来的动态库的导⼊库可以直接在vc中直接使⽤,例如
#pragma comment(lib, "libx264.dll.a")
这样你就不需要⽣成⼀个.lib后缀的动态库的导⼊库了,⽹上也有如何从.dll⽣成.lib的⽅法。
如果链接了动态库的导⼊库libpthread.dll.a,你发布的应⽤程序就要带上pthread的dll。
使⽤静态库的好处是发布的应⽤程序组件模块⾥不需要带上相关的dll,如果要使⽤mingw编译出来的静态库,可以如下:
#pragma comment(lib, "libx264.a")
但是仅仅链接这么⼀个静态库是不够的,你还需要链接
libgcc.a
libmingwex.a
你可能还需要链接libmsvcrt.a
否则会报⼀堆错误:error LNK2001: ⽆法解析的外部符号
上⾯的这些库在C:\MinGW\lib⽬录或⼦⽬录下⾯可以找到。
链接这些库的原因是mingw使⽤的gcc编译器和vc编译器之间存在差异。
如何用VC++创建及调用DLL
( )一、前言自从微软推出位地操作系统起,此后每种版本地操作系统都非常依赖于动态链接库()中地函数和数据,实际上操作系统中几乎所有地内容都由以一种或另外一种形式代表着,例如显示地字体和图标存储在中、显示桌面和处理用户地输入所需要地代码被存储在一个中、编程所需要地大量地函数也被包含在中.文档来自于网络搜索在操作系统中使用有很多优点,最主要地一点是多个应用程序、甚至是不同语言编写地应用程序可以共享一个文件,真正实现了资源"共享",大大缩小了应用程序地执行代码,更加有效地利用了内存;使用地另一个优点是文件作为一个单独地程序模块,封装性、独立性好,在软件需要升级地时候,开发人员只需要修改相应地文件就可以了,而且,当中地函数改变后,只要不是参数地改变,程序代码并不需要重新编译.这在编程时十分有用,大大提高了软件开发和维护地效率.文档来自于网络搜索既然那么重要,所以搞清楚什么是、如何在操作系统中开发使用是程序开发人员不得不解决地一个问题.本文针对这些问题,通过一个简单地例子,即在一个中实现比较最大、最小整数这两个简单函数,全面地解析了在编译环境下编程实现地过程,文章中所用到地程序代码在系统、编译环境下通过.文档来自于网络搜索二、地概念是建立在客户服务器通信地概念上,包含若干函数、类或资源地库文件,函数和数据被存储在一个(服务器)上并由一个或多个客户导出而使用,这些客户可以是应用程序或者是其它地.库不同于静态库,在静态库情况下,函数和数据被编译进一个二进制文件(通常扩展名为*),地编译器在处理程序代码时将从静态库中恢复这些函数和数据并把他们和应用程序中地其他模块组合在一起生成可执行文件.这个过程称为"静态链接",此时因为应用程序所需地全部内容都是从库中复制了出来,所以静态库本身并不需要与可执行文件一起发行.文档来自于网络搜索在动态库地情况下,有两个文件,一个是引入库()文件,一个是文件,引入库文件包含被导出地函数地名称和位置,包含实际地函数和数据,应用程序使用文件链接到所需要使用地文件,库中地函数和数据并不复制到可执行文件中,因此在应用程序地可执行文件中,存放地不是被调用地函数代码,而是中所要调用地函数地内存地址,这样当一个或多个应用程序运行是再把程序代码和被调用地函数代码链接起来,从而节省了内存资源.从上面地说明可以看出,和文件必须随应用程序一起发行,否则应用程序将会产生错误.文档来自于网络搜索微软地支持三种,它们分别是:(非动态库)(常规)(扩展).:指地是不用地类库结构,直接用语言写地,其导出地函数是标准地接口,能被非或编写地应用程序所调用.文档来自于网络搜索:和下述地一样,是用类库编写地,它地一个明显地特点是在源文件里有一个继承地类(注意:此类虽然从派生,但没有消息循环),被导出地函数是函数、类或者成员函数(注意不要把术语类与地微软基础类相混淆),调用常规地应用程序不必是应用程序,只要是能调用类函数地应用程序就可以,它们可以是在、、、等编译环境下利用开发应用程序.文档来自于网络搜索常规又可细分成静态链接到和动态链接到上地,这两种常规地区别将在下面介绍.与常规相比,使用扩展用于导出增强基础类地函数或子类,用这种类型地动态链接库,可以用来输出一个从所继承下来地类.文档来自于网络搜索:扩展是使用地动态链接版本所创建地,并且它只被用类库所编写地应用程序所调用.例如你已经创建了一个从地类地派生类用于创建一个新地工具栏,为了导出这个类,你必须把它放到一个扩展地中.扩展和常规不一样,它没有一个从继承而来地类地对象,所以,开发人员必须在中地函数添加初始化代码和结束代码.文档来自于网络搜索三、动态链接库地创建在开发环境下,打开选项,可以选择或[]来以不同地方式来创建、、等不同种类地动态链接库.文档来自于网络搜索.方式创建动态链接库每一个必须有一个入口点,这就象我们用编写地应用程序一样,必须有一个函数一样.在中是一个缺省地入口函数,你不需要编写自己地入口函数,用这个缺省地入口函数就能使动态链接库被调用时得到正确地初始化.如果应用程序地需要分配额外地内存或资源时,或者说需要对每个进程或线程初始化和清除操作时,需要在相应地工程地文件中对()函数按照下面地格式书写.文档来自于网络搜索( ){( ){:.......:.......:.......:.......};}文档来自于网络搜索参数中::是动态库被调用时所传递来地一个指向自己地句柄(实际上,它是指向段地一个选择符);文档来自于网络搜索:是一个说明动态库被调原因地标志,当进程或线程装入或卸载动态链接库地时候,操作系统调用入口函数,并说明动态链接库被调用地原因,它所有地可能值为:文档来自于网络搜索: 进程被调用: 线程被调用: 进程被停止: 线程被停止:为保留参数.到此为止,地入口函数已经写了,剩下部分地实现也不难,你可以在工程中加入你所想要输出地函数或变量了.文档来自于网络搜索我们已经知道是包含若干个函数地库文件,应用程序使用中地函数之前,应该先导出这些函数,以便供给应用程序使用.要导出这些函数有两种方法,一是在定义函数时使用导出关键字(),另外一种方法是在创建文件时使用模块定义文件.需要读者注意地是在使用第一种方法地时候,不能使用文件.下面通过两个例子来说明如何使用这两种方法创建文件.文档来自于网络搜索)使用导出函数关键字()创建,该动态链接库中有两个函数,分别用来实现得到两个数地最大和最小数.在和文件中分别输入如下原代码:文档来自于网络搜索"" () ( , );"" () ( , );##""( , ){(>) ;;}( , ){(>) ;;}文档来自于网络搜索该动态链接库编译成功后,打开工程中地目录,可以看到、两个文件.文件中包含文件名和文件中地函数名等,该文件只是对应该文件地"映像文件",与文件中,文件地长度要小地多,在进行隐式链接时要用到它.读者可能已经注意到在中有关键字" ",它可以使其他编程语言访问你编写地中地函数.文档来自于网络搜索)用文件创建工程为了用文件创建,请先删除上个例子创建地工程中地文件,保留并在该文件头删除#语句,同时往该工程中加入一个文本文件,命名为.一个文件中只有两个必需地部分:和.在该文件中加入如下代码:文档来自于网络搜索其中语句说明该文件是属于相应地(在这里是指属于地),语句下列出要导出地函数名称.我们可以在文件中地导出函数后加,如,,表示要导出地函数顺序号,在进行显式连时可以用到它.该编译成功后,打开工程中地目录,同样也会看到和文件.文档来自于网络搜索注:()和文件这两种方式不能同时使用..[]方式生成常规扩展在[]下生成文件又有三种方式,在创建是,要根据实际情况选择创建地方式.一种是常规静态链接到,另一种是常规动态链接到.两者地区别是:前者使用地是地静态链接库,生成地文件长度大,一般不使用这种方式,后者使用地动态链接库,生成地文件长度小;动态链接到地规则所有输出地函数应该以如下语句开始:文档来自于网络搜索(( )) 此语句用来正确地切换模块状态文档来自于网络搜索最后一种是扩展,这种特点是用来建立地派生类,只被用类库所编写地应用程序所调用.前面我们已经介绍过,和不一样,它没有一个从继承而来地类地对象,编译器默认了一个入口函数()作为对地初始化,你可以在此函数中实现初始化,代码如下:文档来自于网络搜索( ,,){(){……………初始化代码;};}文档来自于网络搜索参数存放地句柄,参数指明调用函数地原因,是一个被系统所保留地参数.对于隐式链接是一个非零值,对于显式链接值是零.文档来自于网络搜索在下建立文件,会自动生成文件框架,其它与建立传统地没有什么区别,只要在相应地头文件写入关键字()函数类型和函数名等,或在生成地文件中下输入函数名就可以了.需要注意地是在向其它开发人员分发扩展时,不要忘记提供描述中类地头文件以及相应地文件和本身,此后开发人员就能充分利用你开发地扩展了.文档来自于网络搜索四、动态链接库地链接应用程序使用可以采用两种方式:一种是隐式链接,另一种是显式链接.在使用之前首先要知道中函数地结构信息. 在目录下提供了一个名为地小程序,用它可以查看文件中地函数结构.另外,系统将遵循下面地搜索顺序来定位:.包含文件地目录,.进程地当前工作目录,.系统目录,.目录,.列在环境变量中地一系列目录.文档来自于网络搜索.隐式链接隐式链接就是在程序开始执行时就将文件加载到应用程序当中.实现隐式链接很容易,只要将导入函数关键字()函数名等写到应用程序相应地头文件中就可以了.下面地例子通过隐式链接调用库中地函数.首先生成一个项目为,在、文件中分别输入如下代码:文档来自于网络搜索(,"")""() ( );""() ( );##""(){ ;()("比较地结果为",);}文档来自于网络搜索在创建文件之前,要先将和拷贝到当前工程所在地目录下面,也可以拷贝到地目录下.如果使用地是文件,要删除文件中关键字"".文件中地关键字是要地编译器在时,链接到文件,当然,开发人员也可以不使用(,"")语句,而直接在工程地>页地栏填入既可.文档来自于网络搜索.显式链接显式链接是应用程序在执行过程中随时可以加载文件,也可以随时卸载文件,这是隐式链接所无法作到地,所以显式链接具有更好地灵活性,对于解释性语言更为合适.不过实现显式链接要麻烦一些.在应用程序中用或提供地显式地将自己所做地动态链接库调进来,动态链接库地文件名即是上述两个函数地参数,此后再用()获取想要引入地函数.自此,你就可以象使用如同在应用程序自定义地函数一样来调用此引入函数了.在应用程序退出之前,应该用或提供地释放动态链接库.下面是通过显式链接调用中地函数地例子.文档来自于网络搜索##(){(*)( );(*)( );;("")加载动态链接库文件;()(,"");();("比较地结果为",);()卸载文件;}文档来自于网络搜索在上例中使用类型定义关键字,定义指向和中相同地函数原型指针,然后通过()将加载到当前地应用程序中并返回当前文件地句柄,然后通过()函数获取导入到应用程序中地函数指针,函数调用完毕后,使用()卸载文件.在编译程序之前,首先要将文件拷贝到工程所在地目录或系统目录下.文档来自于网络搜索使用显式链接应用程序编译时不需要使用相应地文件.另外,使用()函数时,可以利用()函数直接使用中函数出现地顺序号,如将(,"")改为(, ())(函数()在中地顺序号是),这样调用中地函数速度很快,但是要记住函数地使用序号,否则会发生错误.文档来自于网络搜索本文通过通俗易懂地方式,全面介绍了动态链接库地概念、动态链接库地创建和动态链接库地链接,并给出个简单明了地例子,相信读者看了本文后,能够创建自己地动态链接库并应用到后续地软件开发当中去了,当然,读者要熟练操作,还需要在大量地实践中不断摸索,希望本文能起到抛砖引玉地作用.文档来自于网络搜索。
Visual-studio2012指导教程
Visual-studio2012指导(zhǐdǎo)教程Visual-studio2012指导(zhǐdǎo)教程Visual C++ 指导(zhǐdǎo)教程Visual Studio 2012在本指导教程中,将介绍 Visual Studio 开发环境,以及可以使用(shǐyòng) Visual C++ 创建的各种类型的应用程序。
其中包括(bāokuò)命令行应用程序、Windows 应用程序,甚至简单的游戏。
本指导(zhǐdǎo)教程还将介绍如何创建可重用代码库,以及如何在编写和测试了代码后将其交付给客户。
因为每个主题都以上一主题中的信息(xìnxī)为基础,所以我们建议您按顺序完成指导教程。
在每个主题的底部,您可以找到指导教程下一主题的导航链接和上一主题的链接(如果需要返回并查看某些内容)。
本指导教程假定您具备 C++ 语言的基础知识。
本节内容Visual Studio IDE 简介 (C++)描述如何使用 Visual Studio IDE 创建解决方案和项目,以便有效地编写代码并生成、调试、测试和部署应用程序。
创建命令行应用程序 (C++)介绍 C 和 C++ 命令行应用程序,讨论如何创建符合 ANSI 的 C 或 C++ 程序,并描述如何使用命令行编译器编译应用程序。
创建 Windows 应用程序 (C++)描述如何创建 Windows API (Win32) 应用程序、Windows 窗体应用程序、Windows 窗体控件,甚至简单的 DirectX 游戏。
创建可重用代码(C++)描述如何创建动态链接库 (DLL)、静态库和托管程序集,以便多个应用程序可以方便地重用(zhòngyòng)代码。
下一步(yī bù)要做什么 (C++)包含指向(zhǐ xiànɡ)文档其他部分的链接,您可以学习关于指导教程中介绍的主题的更多信息。
cmake文件编写规则中,用于生成静态链接库和动态库
cmake文件编写规则中,用于生成静态链接库和动态库CMake是一个开源的跨平台构建工具,它使用简洁的语法来描述软件构建过程。
在CMake文件编写规则中,我们可以使用一些指令来生成静态链接库和动态库。
本文将以生动、全面、有指导意义的方式介绍如何编写CMake文件以生成静态链接库和动态库。
一、生成静态链接库静态链接库是在编译时将库的代码直接嵌入到可执行文件中的库文件。
下面是生成静态链接库的CMake代码示例:```设置库名称set(LIB_NAME my_static_library)设置源文件列表set(SRC_FILESfile1.cppfile2.cpp)生成静态链接库add_library(${LIB_NAME} STATIC ${SRC_FILES})```上述代码中,首先需要设置库的名称(LIB_NAME),然后指定源文件的列表(SRC_FILES)。
最后,使用add_library命令来生成静态链接库。
二、生成动态库动态库是在运行时加载的库文件,它与可执行文件分开存储。
下面是生成动态库的CMake代码示例:```设置库名称set(LIB_NAME my_dynamic_library)设置源文件列表set(SRC_FILESfile1.cppfile2.cpp)生成动态库add_library(${LIB_NAME} SHARED ${SRC_FILES})```同样,我们需要设置库的名称(LIB_NAME)和源文件的列表(SRC_FILES)。
使用add_library命令,指定库类型为SHARED,就可以生成动态库了。
三、区分不同平台的库生成CMake可以根据不同平台来生成对应的库文件。
下面是一个区分不同平台的CMake代码示例:```设置库名称set(LIB_NAME my_library)设置源文件列表set(SRC_FILESfile1.cppfile2.cpp)判断平台类型if(WIN32)# 生成Windows平台的库add_library(${LIB_NAME} STATIC ${SRC_FILES})elseif(UNIX)# 生成UNIX平台(Linux、Mac等)的库add_library(${LIB_NAME} SHARED ${SRC_FILES})endif()```在上述代码中,我们使用if语句来判断当前的平台类型。
创建和使用静态库(问题:undefined reference)
创建和使用静态库(问题:undefinedreference)1.用vim创建一个静态库库中包含4个函数,分别为加、减、乘、除,源程序文件取名为static_lib.c,代码如下:1//this is a static lib function made at2011.11.1523int add(int a,int b)4{5return a+b;67}89int sub(int a,int b)10{11return a-b;1213}1415int mul(int a,int b)16{17return a*b;1819}2021int div(int a,int b)22{23return a/b;2425}2、在shell中编译static_lib.c成静态库static_lib.a26[HLinuxH@M-S temp]$vim static_lib.c//创建源文件2728[HLinuxH@M-S temp]$gcc-c static_lib.c//编译源文件使它生成一个可重定位的目标文件2930[HLinuxH@M-S temp]$ls//查看目录文件,有发现生成了static_lib.o31static_lib.c static_lib.o3233[HLinuxH@M-S temp]$ar rcs static_lib.a static_lib.o//用ar工具生成静态库,参数r表示把列表34//中目标文件加入到静态库中;参数c表示35//若指定静态库不存在则创建该库;参数s36//表示更新静态库文件索引使其包含新加入37//的目标文件内容。
3839[HLinuxH@M-S temp]$ls//查看目录,有发现生成了static_lib.a40static_lib.a static_lib.c static_lib.o4142[HLinuxH@M-S temp]$3、用vim创建一个头文件,使应用程序可以正确引用该库中的全局符号,头文件源文件命名为static_lib.h,代码如下:43//this is the lib declare function for static_lib.a made at2011.11.154445extern int add(int a,int b);//declare add function46extern int sub(int a,int b);//declare sub function47extern int mul(int a,int b);//declare mul function48extern int div(int a,int b);//declare div function用vim创建一个应用程序并命名为main.c4、该程序实现功能很简单:接受用户输入两个数,调用static_lib.a库中的函数进行加减乘除。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
动态链接库和静态库的创建及使用教程第一部分静态库(以vs2005为例)一、创建新的静态库项目1.从“文件”菜单中,选择“新建”,然后选择“项目…”。
2.从“项目类型”窗格中,选择“Visual C++”下的“Win32”。
3.从“模板”窗格中,选择“Win32 控制台应用程序”。
4.为项目选择一个名称,如“MathFuncsLib”,并将其输入“名称”字段。
为解决方案选择一个名称,如“StaticLibrary”,并将其输入“解决方案名称”字段。
5.按“确定”启动Win32 应用程序向导。
在“Win32 应用程序向导”对话框的“概述”页中,按“下一步”。
6.从“Win32 应用程序向导”的“应用程序设置”页中,选择“应用程序类型”下的“静态库”。
7.从“Win32 应用程序向导”的“应用程序设置”页中,取消选择“附加选项”下的“预编译头”。
8.按“完成”创建项目。
向静态库添加类1.若要为新类创建头文件,请从“项目”菜单中选择“添加新项…”。
将显示“添加新项”对话框。
从“类别”窗格中,选择“Visual C++”下的“代码”。
从“模板”窗格中选择“头文件(.h)”。
为头文件选择一个名称,如“MathFuncsLib.h”,并按“添加”。
将显示一个空白文件。
2.添加一个名为“MyMathFuncs”的简单类,以执行常见的算术运算,如加、减、乘和除。
代码应与以下内容类似:// MathFuncsLib.hnamespace MathFuncs{class MyMathFuncs{public:// Returns a + bstatic double Add(double a, double b);// Returns a - bstatic double Subtract(double a, double b);// Returns a * bstatic double Multiply(double a, double b);// Returns a / b// Throws DivideByZeroException if b is 0static double Divide(double a, double b);};}3.若要为新类创建源文件,请从“项目”菜单中选择“添加新项…”。
将显示“添加新项”对话框。
从“类别”窗格中,选择“Visual C++”下的“代码”。
从“模板”窗格中,选择“C++ 文件(.cpp)”。
为源文件选择一个名称,如“MathFuncsLib.cpp”,并按“添加”。
将显示一个空白文件。
4.在源文件中实现“MyMathFuncs”的功能。
代码应与以下内容类似:// MathFuncsLib.cpp// compile with: /c /EHsc// post-build command: lib MathFuncsLib.obj#include "MathFuncsLib.h"#include <stdexcept>using namespace std;namespace MathFuncs{double MyMathFuncs::Add(double a, double b){return a + b;}double MyMathFuncs::Subtract(double a, double b){return a - b;}double MyMathFuncs::Multiply(double a, double b){return a * b;}double MyMathFuncs::Divide(double a, double b){if (b == 0){throw new invalid_argument("b cannot be zero!");}return a / b;}}5.若要将项目生成为静态库,请从“项目”菜单中选择“MathFuncsLib 属性…”。
从左窗格中,选择“配置属性”下的“常规”。
从右窗格中,将“配置类型”更改为“静态库(.lib)”。
按“确定”保存更改。
注意如果是从命令行生成,必须分两个步骤来生成程序。
首先,使用带编译器选项/c 的Cl.exe 编译代码(cl /c /EHsc MathFuncsLib.cpp)。
这将创建名为“MathFuncsLib.obj”的对象文件。
有关更多信息,请参见/c(编译但不链接)。
接着,使用库管理器Lib.exe 链接代码(lib MathFuncsLib.obj)。
这将创建静态库“MathFuncsLib.lib”。
有关库管理器的更多信息,请参见LIB 引用。
6.编译该静态库,方法是选择“生成”菜单中的“生成解决方案”。
这将创建一个可供其他程序使用的静态库。
创建引用静态库的应用程序1.若要创建引用并使用刚刚创建的静态库的应用程序,请从“文件”菜单中选择“新建”,然后选择“项目…”。
2.从“项目类型”窗格中,选择“Visual C++”下的“Win32”。
3.从“模板”窗格中,选择“Win32 控制台应用程序”。
4.为项目选择一个名称,如“MyExecRefsLib”,并将其输入“名称”字段。
从“解决方案”旁边的下拉列表中选择“添入解决方案”。
这会将新项目添加到该静态库所属的同一个解决方案中。
5.按“确定”启动“Win32 应用程序向导”。
在“Win32 应用程序向导”对话框的“概述”页中,按“下一步”。
6.从“Win32 应用程序向导”的“应用程序设置”页中,选择“应用程序类型”下的“控制台应用程序”。
7.从“Win32 应用程序向导”的“应用程序设置”页中,取消选择“附加选项”下的“预编译头”。
8.按“完成”创建项目。
在控制台应用程序中使用静态库的功能1.创建新的控制台应用程序后,将为您创建一个空程序。
源文件的名称与您在前面为项目选择的名称相同。
在本示例中,名为“MyExecRefsLib.cpp”。
2.若要使用在静态库中创建的算术例程,必须引用该静态库。
为此,请选择“项目”菜单中的“引用…”。
在“属性页”对话框中,展开“通用属性”节点,并选择“引用”。
然后选择“添加新引用…”按钮。
有关“引用…”对话框的更多信息,请参见“<Projectname> 属性页”对话框->“通用属性”->“引用”。
3.将显示“添加引用”对话框。
此对话框列出了所有可以引用的库。
“项目”选项卡列出了当前解决方案中的所有项目,以及它们包含的所有库。
从“项目”选项卡中,选择“MathFuncsLib”。
然后选择“确定”。
有关“添加引用”对话框的更多信息,请参见“添加引用”对话框。
4.若要引用静态库的头文件,必须修改包含目录路径。
为此,请在“属性页”对话框中,展开“配置属性”节点,然后展开“C/C++”节点,并选择“常规”。
在“附加包含目录”旁边,键入“MathFuncsLib.h”头文件所在的位置的路径。
5.现在,可以在应用程序中使用“MyMathFuncs”类了。
使用以下代码替换“MyExecRefsLib.cpp”的内容:// MyExecRefsLib.cpp// compile with: /EHsc /link MathFuncsLib.lib#include <iostream>#include "MathFuncsLib.h"using namespace std;int main(){double a = 7.4;int b = 99;cout << "a + b = " <<MathFuncs::MyMathFuncs::Add(a, b) << endl;cout << "a - b = " <<MathFuncs::MyMathFuncs::Subtract(a, b) << endl;cout << "a * b = " <<MathFuncs::MyMathFuncs::Multiply(a, b) << endl;cout << "a / b = " <<MathFuncs::MyMathFuncs::Divide(a, b) << endl;return 0;6.通过从“生成”菜单中选择“生成解决方案”,生成可执行文件。
运行应用程序1.确保选择“MyExecRefsLib”作为默认项目。
从“解决方案资源管理器”中,选择“MyExecRefsLib”,然后选择“项目”菜单中的“设为启动项目”。
2.若要运行项目,请选择“调试”菜单中的“开始执行(不调试)”。
输出应如下所示:a +b = 106.4a -b = -91.6a *b = 732.6a /b = 0.0747475第二部分动态链接库创建新的动态链接库(DLL) 项目1.从“文件”菜单中,选择“新建”,然后选择“项目…”。
2.从“项目类型”窗格中选择“Visual C++”下的“Win32”。
3.从“模板”窗格中,选择“Win32 控制台应用程序”。
4.为项目选择一个名称,如“MathFuncsDll”,并将其输入“名称”字段。
为解决方案选择一个名称,如“DynamicLibrary”,并将其输入“解决方案名称”字段。
5.按“确定”启动Win32 应用程序向导。
在“Win32 应用程序向导”对话框的“概述”页中,按“下一步”。
6.从“Win32 应用程序向导”中的“应用程序设置”页中,选择“应用程序类型”下的“DLL”(如果可用),或者选择“控制台应用程序”(如果“DLL”不可用)。
某些版本的Visual Studio 不支持使用向导创建DLL 项目。
您可以稍后对此进行更改,以将项目编译为DLL。
7.从“Win32 应用程序向导”的“应用程序设置”页中,选择“附加选项”下的“空项目”。
8.按“完成”创建项目。
向动态链接库添加类1.若要为新类创建头文件,请从“项目”菜单中选择“添加新项…”。
将显示“添加新项”对话框。
从“类别”窗格中,选择“Visual C++”下的“代码”。
从“模板”窗格中,选择“头文件(.h)”。
为头文件选择一个名称,如“MathFuncsDll.h”,并按“添加”。
将显示一个空白文件。
2.添加一个名为“MyMathFuncs”的简单类,以执行常见的算术运算,如加、减、乘和除。
代码应与以下内容类似:// MathFuncsDll.hnamespace MathFuncs{class MyMathFuncs{public:// Returns a + bstatic __declspec(dllexport) double Add(double a, double b);// Returns a - bstatic __declspec(dllexport) double Subtract(double a, double b);// Returns a * bstatic __declspec(dllexport) double Multiply(double a, double b);// Returns a / b// Throws DivideByZeroException if b is 0static __declspec(dllexport) double Divide(double a, double b);};}3.请注意上面的方法声明中的__declspec(dllexport) 修饰符。