VS2015动态库使用示例

一、库基础知识

已经写好并且可以进行复用的代码,按照链接方式可分为两种 :动态库和静态库。他们在链接时起作用。

                 

静态库:使用静态链接方式,库中的所有数据代码都将拷贝到调用程序的代码空间中去。也就是说你在哪调用了库中的函数,                        它会将被调用的函数的的数据代码全部拷贝到该位置。在链接阶段就直接打包进可执行文件中。

动态库:用动态链接方式,在链接时dll并不拷贝入最终生成的.exe。在程序运行需要调用dll时,才会加载。

总之一句话:动态链接相比于静态链接,生成的可执行文件要小,但是运行时调用库所花费的时间要长。

(好了,让我真刀真枪的干上一场吧哈哈哈)

 

二、VS2015使用动态库简单示例

1.打开V2015 -> 建立win32项目

2.点击下一步

3.选择DLL->选择导出符号(方便初学者使用) -> 选择下一步(当然附加选项可以选上 导出符号 ,会多一个接口,一般我是自己写接口的)

4.开始编写一个简单的库例程

我书写的是一个HELLO函数

1.在DLL_Project.cpp中添加如下函数内容

2.在DLL_Project.h中添加如下函数声明

3.点击生成解决按方案

出现如下文件,拷贝复制到你需要这个库的工程的可执行文文件同级目录下

4.添加.lib,点开工程属性->链接器->常规->附加库目录->浏览选择你.lib的路径(当然也可以添加相对路径,移植性更高,这里使用绝对路径)

5.点开 链接器 下的 输入 选项 -> 附加依赖项 -> 填写你的.lib全名

6.调用运行啦

运行结果

到这你是不是觉得结束了?那你就太天真了,就没有想过为什么我创建一个DLL工程,为啥会出现一个.lib嘛

哈哈哈哈,好好解释下

 

静态库:在vs中新建生成静态库的工程,编译生成成功后,只产生一个.lib文件


动态库:动态链接库是一个包含可由多个程序同时使用的代码和数据的库,DLL不是可执行文件。动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于一个 DLL 中,该 DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。在vs中新建生成动态库的工程,编译成功后,产生一个.lib文件和一个.dll文件

静态库中的lib:该LIB包含函数代码本身(即包括函数的索引,也包括实现),在编译时直接将代码加入程序当中
动态库中的lib:该LIB包含了函数所在的DLL文件和文件中函数位置的信息(索引),函数实现代码由运行时加载在进程空间中的DLL提供
总之,lib是编译时用到的,dll是运行时用到的。如果要完成源代码的编译,只需要lib;如果要使动态链接的程序运行起来,只需要dll。
 

参考https://blog.csdn.net/qq_17239003/article/details/78482145

特此鸣谢

 

  • 6
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
假设有一个名为`myapp`的可执行文件,需要引入名为`libfoo.so`的动态库使用其中的函数,可以按照以下步骤进行: 1. 创建`CMakeLists.txt`文件,并在其中添加以下内容: ``` cmake_minimum_required(VERSION 3.5) project(myapp) add_executable(myapp main.cpp) find_library(foo NAMES foo PATHS /usr/local/lib) target_link_libraries(myapp ${foo}) ``` 其中,`main.cpp`是`myapp`的源文件,`foo`是要引入的动态库的名称,`/usr/local/lib`是`libfoo.so`所在的路径。 2. 创建`main.cpp`文件,并在其中使用`libfoo.so`中的函数: ```c++ #include <iostream> #include <dlfcn.h> typedef int (*foo_func_t)(int, int); int main() { void *handle = dlopen("libfoo.so", RTLD_LAZY); if (!handle) { std::cerr << "Error: " << dlerror() << std::endl; return 1; } foo_func_t foo_func = (foo_func_t)dlsym(handle, "foo"); if (!foo_func) { std::cerr << "Error: " << dlerror() << std::endl; dlclose(handle); return 1; } int result = foo_func(3, 4); std::cout << "Result: " << result << std::endl; dlclose(handle); return 0; } ``` 在`main.cpp`中,首先使用`dlopen`函数打开`libfoo.so`动态库,然后使用`dlsym`函数获取其中的`foo`函数,并将其保存到函数指针变量`foo_func`中。最后,调用`foo_func`函数并输出结果。 注意,这里使用了`dlfcn.h`头文件中的函数,需要在编译时链接`dl`库,可以在`CMakeLists.txt`中添加以下命令: ``` target_link_libraries(myapp dl) ``` 3. 在命令行中执行以下命令进行编译: ``` mkdir build cd build cmake .. make ``` 编译完成后,可以运行`myapp`可执行文件,输出结果应为`Result: 7`。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值