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++实现单向循环链表的解决方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C 语言常用方法技巧

    C 语言常用方法技巧

    本文主要介绍了C语言常用方法技巧。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-03-03
  • C语言二叉树与堆的概念与实现

    C语言二叉树与堆的概念与实现

    这篇文章主要给大家介绍了关于C语言二叉树与堆的相关资料,文章详细记录了他们的相关概念以及如何实现的,通过图文介绍的非常详细,需要的朋友可以参考下
    2021-06-06
  • C++ 中const对象与const成员函数的实例详解

    C++ 中const对象与const成员函数的实例详解

    这篇文章主要介绍了C++ 中const对象与const成员函数的实例详解的相关资料,希望通过本文能让大家彻底掌握该如何使用,需要的朋友可以参考下
    2017-08-08
  • c语言处理函数调用的方法

    c语言处理函数调用的方法

    函数就是一段封装好的,可以重复使用的代码,它使得我们的程序更加模块化,不需要编写大量重复的代码。这篇文章主要介绍了c语言是如何处理函数调用的?需要的朋友可以参考下
    2021-11-11
  • 从C语言过渡到C++之基本变化

    从C语言过渡到C++之基本变化

    在之前的C++代码训练营系列中,我试图用完成具体项目的方式给大家介绍C++,但后来大家反馈说这样从C过渡到C++有点跟不上。于是我又专门设计了这个《从C到C++》的过渡专题,我准备通过10篇文章介绍一下C++和C的重要区别。
    2017-07-07
  • C++如何调用简单的python程序

    C++如何调用简单的python程序

    这篇文章主要介绍了C++如何调用简单的python程序问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • C语言实现BF算法案例详解

    C语言实现BF算法案例详解

    这篇文章主要介绍了C语言实现BF算法案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • 深入分析C中不安全的sprintf与strcpy

    深入分析C中不安全的sprintf与strcpy

    本篇文章是对C中不安全的sprintf与strcpy函数的使用进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C语言递归思想实现汉诺塔详解

    C语言递归思想实现汉诺塔详解

    大家好,本篇文章主要讲的是C语言递归思想实现汉诺塔详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01

最新评论