C++中.dll与.lib文件的生成与使用的详解
在Windows系统下,动态链接库(DLL)和静态库(LIB)是常用的代码重用手段。在C++中,我们可以通过Visual Studio来生成这两种库文件。
一、生成DLL文件
DLL(Dynamic-link Library)可以在程序运行时动态加载,它可以实现代码共享和隔离。下面是生成DLL文件的步骤:
-
在Visual Studio中创建一个动态链接库项目。
-
编写代码如下:
```c++
#include
extern "C" __declspec(dllexport) void hello()
{
printf("Hello, World!\n");
}
```
我们需要在函数前加上__declspec(dllexport)
,表示该函数将要被导出。
- 编译生成DLL文件。
在Visual Studio中,生成DLL文件有两种方式:一个是在项目属性中设置,另一个是通过命令行生成。
通过命令行生成DLL文件:
cl /LD hello.cpp
这条命令将会生成hello.dll
和hello.lib
两个文件。
在项目属性中设置:
选择“属性”->“配置属性”->“常规”,将“配置类型”改为“动态库(.dll)”。然后编译项目,将会生成hello.dll
和hello.lib
两个文件。
- 测试DLL文件
我们可以通过另一个C++程序来测试DLL文件的使用。首先,需要将hello.dll
放到与测试程序相同的目录下。然后编写测试程序代码如下:
```c++
#include
#include
typedef void (*hello_func)();
int main()
{
HMODULE hModule = LoadLibraryA("hello.dll");
if (NULL == hModule)
{
printf("LoadLibraryA error\n");
return -1;
}
hello_func hello = (hello_func)GetProcAddress(hModule, "hello");
if (NULL == hello)
{
printf("GetProcAddress error\n");
return -1;
}
hello();
FreeLibrary(hModule);
return 0;
}
```
通过LoadLibraryA
函数来加载hello.dll
,再通过GetProcAddress
函数获取hello
函数的地址,最后调用hello
函数即可。
二、生成LIB文件
LIB(Library)是静态链接库,它可以在编译时链接到程序中,不需要在运行时重新加载。下面是生成LIB文件的步骤:
-
在Visual Studio中创建一个静态链接库项目。
-
编写代码如下:
```c++
#include
extern "C" void hello()
{
printf("Hello, World!\n");
}
```
不需要在函数前加上__declspec(dllexport)
,因为静态链接库不需要导出符号。
- 编译生成LIB文件。
在Visual Studio中,生成LIB文件有两种方式:一个是在项目属性中设置,另一个是通过命令行生成。
通过命令行生成LIB文件:
cl /c hello.cpp
lib hello.obj
这条命令将会生成hello.lib
文件。
在项目属性中设置:
选择“属性”->“配置属性”->“常规”,将“配置类型”改为“静态库(.lib)”。然后编译项目,将会生成hello.lib
文件。
- 测试LIB文件
我们可以通过另一个C++程序来测试LIB文件的使用。在测试程序中,需要添加hello.lib
文件。编写测试程序代码如下:
```c++
#include
extern "C" void hello();
int main()
{
hello();
return 0;
}
```
直接调用hello
函数即可。
示例1:生成并使用DLL文件
-
在Visual Studio中创建一个Win32 Console Application项目。
-
编写代码如下:
```c++
#include
extern "C" __declspec(dllexport) void hello()
{
printf("Hello, World!\n");
}
```
- 选择项目->Add->New Item,新增一个C++文件,命名为“test.cpp”,并编写如下代码:
```c++
#include
#include
typedef void (*hello_func)();
int main()
{
HMODULE hModule = LoadLibraryA("DynamicLibrary.dll");
if (NULL == hModule)
{
printf("LoadLibraryA error\n");
return -1;
}
hello_func hello = (hello_func)GetProcAddress(hModule, "hello");
if (NULL == hello)
{
printf("GetProcAddress error\n");
return -1;
}
hello();
FreeLibrary(hModule);
return 0;
}
```
-
选择“属性”->“配置属性”->“常规”,将“配置类型”改为“动态库(.dll)”。
-
编译并运行程序,控制台输出“Hello, World!”即说明动态链接库运行成功。
示例2:生成并使用LIB文件
-
在Visual Studio中创建一个Win32 Console Application项目。
-
编写代码如下:
```c++
#include
extern "C" void hello()
{
printf("Hello, World!\n");
}
```
-
选择“属性”->“配置属性”->“常规”,将“配置类型”改为“静态库(.lib)”。
-
编译并运行程序,控制台输出“Hello, World!”即说明静态链接库运行成功。
总结:
生成DLL文件和LIB文件的过程类似,不同之处在于生成过程的配置类型。DLL文件需要设置为“动态库(.dll)”,LIB文件需要设置为“静态库(.lib)”。在使用DLL文件时,需要通过LoadLibraryA和GetProcAddress函数来获取函数地址,而使用LIB文件则直接调用即可。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c++中.dll与.lib文件的生成与使用的详解 - Python技术站