C++ 项目引入lib和dll的区别与使用实战
作者:wangnaisheng
一、介绍
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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!