C++ 项目引入lib和dll的区别与使用实战

 更新时间:2024年02月04日 10:33:06   作者:wangnaisheng  
静态链接库与动态链接库都是共享代码的方式,本文主要介绍了C++项目引入lib和dll的区别与使用实战,具有一定的参考价值,感兴趣的可以了解一下

一、介绍

1.1、lib 文件(静态库):

编译时使用:当项目链接静态库(.lib 文件)时,编译器会将库中的代码直接嵌入到最终生成的可执行文件中。

其特点:程序体积较大:因为包含了所有被调用函数的完整实现,不依赖外部动态库就能独立运行。
不需要运行时寻找:发布程序时无需携带额外的库文件,用户不需要安装或放置任何额外的库就可以运行程序。
版本更新麻烦:如果静态库有更新,需要重新编译链接整个应用程序才能应用新版本的库。

1.2、dll 文件(动态链接库):

运行时加载:应用程序在运行时通过链接器的导入表找到对应的.dll 文件并加载其函数地址到进程空间中执行。

其特点:程序体积较小:只包含所调用函数的引用信息,实际函数体在dll中,减少了内存占用和磁盘空间。
运行时依赖:发布程序时必须同时提供相应的dll文件,否则用户在没有这些dll的情况下无法运行程序。
动态加载与更新灵活:可以实现热更新功能,只需要替换dll文件即可更新相应模块的功能,而无需重新编译整个应用程序。

二、区别及联系

2.1、编译和链接:

lib 是静态库,在编译时将库的代码直接嵌入到可执行文件中。这意味着当你使用静态库时,你的可执行文件会包含库的所有代码,因此在运行时不需要额外的库文件。
dll 是动态链接库,它是一个独立的文件,在运行时被动态地加载到进程中。使用动态链接库时,你的可执行文件只包含对库的引用,在运行时系统会根据需要加载并链接库。

2.2、可维护性和更新:

使用静态库,如果库有更新,你需要重新编译和链接你的项目。
使用动态链接库,如果库有更新,你只需要替换.dll 文件,而不需要重新编译你的项目。

2.3、内存占用和性能:

静态库会将库的代码全部包含在可执行文件中,因此会增加可执行文件的大小。
使用动态链接库,只有在程序实际使用库中的函数时,才会将相关代码加载到内存中。这可以减少程序的内存占用。

2.4、跨平台考虑:

静态链接库通常是平台特定的,因为它们直接嵌入到可执行文件中。
动态链接库可能是跨平台的,因为它们独立于可执行文件运行,但仍然需要考虑不同平台之间的差异和兼容性问题。

2.5、需要注意的事项:

路径问题:确保动态链接时,运行环境能找到必要的dll文件。这可能需要将dll放在系统的PATH环境变量包含的目录下,或者与exe文件位于同一目录下。
版本兼容性:不同版本的dll可能会有不同的API接口或行为,因此要保证程序使用的dll版本与开发时链接的lib或dll头文件相匹配,避免因版本不一致导致的运行错误。
部署与维护:动态链接库通常要求在分发软件时一并提供所有依赖的dll,而且需注意的是,某些dll可能还会有它们自己的依赖链,需要一同处理。
安全性和稳定性:静态链接可以减少由于缺少dll或dll版本不正确带来的运行时故障风险,但可能导致程序包更大;动态链接则更利于资源管理和更新,但若管理不当,则会增加部署和运行时出错的可能性。

总的来说,选择使用 lib 还是 dll 取决于项目需求、可维护性要求以及性能考虑。

三、实战

简单的接口:

max.h:

#ifndef MAX_H_
#define MAX_H_
#ifdef _cplusplus
extern "C"
{
#endif
    int max(int a, int b);
#ifdef cplusplus
}
/* code */
#endif //_cplusplus

#endif //MAX_H_

max.cpp

#include "max.h"
#include <iostream>

int max(int a, int b)
{
    return a > b ? a : b;
}

然后在此处写CMakeLists.txt

SET(LIBMAX_SRC max.cpp)
ADD_LIBRARY(max SHARED ${LIBMAX_SRC})

然后cmake .

make就能得到.so

然后编写main.cpp 也就是调用接口的。

#include <iostream>
#include "max.h"
int main(int argc, char const *argv[])
{
    std::cout<<"max: "<<max(2,3)<<std::endl;
    return 0;
}

然后再编写一个CMAKE

# 设置cmake的最小版本
cmake_minimum_required(VERSION 2.8.8)
# 项目名称
project(main)
# 设置C++编译器,设置变量路径
set(CMAKE_CXX_STANDARD 11)
# 项目中的include路径
include_directories(lib)
# 项目中的lib路径
link_directories(lib)
add_executable(main main.cpp)
#链接libmax.so
target_link_libraries(main max)

然后编译:

cmake ..

make

就能得到结果

到此这篇关于C++ 项目引入lib和dll的区别与使用实战的文章就介绍到这了,更多相关C++ lib和dll内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言之函数递归的实现

    C语言之函数递归的实现

    本文主要介绍了C语言之函数递归的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • C++对象排序的比较你了解吗

    C++对象排序的比较你了解吗

    这篇文章主要为大家详细介绍了C++对象排序的比较,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-02-02
  • C++中vector的清理回收的方式

    C++中vector的清理回收的方式

    这篇文章主要介绍了C++中vector的清理回收的方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • C++编程中将引用类型作为函数参数的方法指南

    C++编程中将引用类型作为函数参数的方法指南

    这篇文章主要介绍了C++编程中将引用类型作为函数参数的方法指南,是C++入门学习中的基础知识,需要的朋友可以参考下
    2015-09-09
  • c语言malloc函数的用法示例和意义

    c语言malloc函数的用法示例和意义

    mallo函数返回的实际是一个无类型指针,必须在其前面加上指针类型强制转换才可以使用,这篇文章主要介绍了c语言malloc函数的用法示例和意义,需要的朋友可以参考下
    2022-12-12
  • Gstreamer基础知识教程

    Gstreamer基础知识教程

    由于deepstream是基于gstreamer的,所以要想在deepstream上做拓展,需要对gstreamer有一定的认识,以下主要介绍Gstreamer整体框架和Gstreamer基础概念,需要的朋友可以参考下
    2022-07-07
  • 可读可执行的C语言简历源文件

    可读可执行的C语言简历源文件

    这篇文章主要为大家家详细介绍了可读可执行的C语言简历源文件,感兴趣的小伙伴们可以参考一下
    2016-07-07
  • C语言实现影院售票管理系统

    C语言实现影院售票管理系统

    这篇文章主要为大家详细介绍了C语言实现影院售票管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • C++编译/编辑器对OIer的必要功能(推荐)

    C++编译/编辑器对OIer的必要功能(推荐)

    这篇文章主要介绍了C++编译/编辑器对OIer的必要功能,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-04-04
  • C++控制台版扫雷游戏

    C++控制台版扫雷游戏

    这篇文章主要为大家详细介绍了C++控制台版扫雷游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05

最新评论