动态链接库和静态链接库的区别
动态链接库和静态链接库是两种不同的库文件,它们在编译和运行时的行为有所不同。以下是它们的区别:
静态链接库:
- 静态链接库在编译时被链接到可执行文件中,因此可执行文件包含了库的代码和数据。
- 静态链接库的文件扩展名通常是 .a(在 Unix/Linux 系统中)或 .lib(在 Windows 系统中)。
- 优点是在运行时不需要额外的库文件,因为所有的代码和数据都已经被链接到可执行文件中。
- 缺点是如果多个可执行文件使用了相同的静态链接库,会导致代码的重复,造成可执行文件体积增大。
动态链接库:
- 动态链接库在运行时被加载到内存中,因此可执行文件只包含了对库的引用,而不包含库的实际代码和数据。
- 动态链接库的文件扩展名通常是 .so(在 Unix/Linux 系统中)或 .dll(在 Windows 系统中)。
- 优点是多个可执行文件可以共享同一个动态链接库,减少了可执行文件的体积,并且可以在运行时更新库文件而不需要重新编译可执行文件。
- 缺点是在运行时需要确保动态链接库可以被找到,有时会出现版本兼容性问题。
总的来说,静态链接库将库的代码和数据直接链接到可执行文件中,而动态链接库在运行时加载到内存中。选择使用哪种库取决于项目的需求和设计考虑。
1、生成动态链接库
1.1、创建链接库项目
依次点击-> File
-> New
-> Project...
选择 C++ Library
,注意右侧的 Library type
要选择 shared
,然后点右下角的 create 按钮
创建好的项目目录结构如下图
1.2、修改代码
library.h
代码如下
#ifndef DYNAMIC_LIB_LIBRARY_H
#define DYNAMIC_LIB_LIBRARY_H
void hello();
#endif //DYNAMIC_LIB_LIBRARY_H
library.cpp
代码如下
#include "library.h"
#include <iostream>
void hello() {
std::cout << "Hello, dynamic lib" << std::endl;
}
1.3、修改编译配置
CMakeLists.txt
文件内容如下
cmake_minimum_required(VERSION 3.23)
project(dynamic_lib)
set(CMAKE_CXX_STANDARD 11)
# 生成 动态的 xxx.dll 文件
add_library(dynamic_lib SHARED library.cpp)
# 这样也可以
#add_library(dynamic_lib SHARED library.cpp library.h)
注意以下这行代码,SHARED
表示动态链接库,STATIC
表示静态链接库
add_library(dynamic_lib SHARED library.cpp) # 动态链接库
add_library(dynamic_lib STATIC library.cpp) # 静态链接库
然后我们点击这个圆圈,表示加载 Cmake 项目,会运行CMakeLists.txt
文件中代码,执行完成后会在项目根目录生成一个名为cmake-build-debug
的目录,其实项目创建好之后会自动加载一次,在这边为了保险起见,在执行一次;
1.4、构建
开始构建,有三种方式可以构建
- 依次点击 -> Build -> Build ‘xxx’
- 点击下图中绿色的锤子
- 输入快捷键 Ctrl + F9
构建后,动态链接库会生成 xxx.dll
文件
静态链接库会生成 xxx.a
文件
到这一步,动态/静态链接库就已经生成了
2、调用动/静态链接库
2.1、创建项目
依次点击 File -> New -> Project… -> C++ Executable
创建后的结构目录如下
然后我们将刚刚生成的动态/静态链接库和头文件放进去
- 将头文件放入 include 目录
- 将动态/静态链接库dll放入 lib 目录
放完后的目录交给如下
2.2、修改编译配置
接下来修改 CMakeLists.txt
文件
# 指定lib目录
link_directories(${PROJECT_SOURCE_DIR}/lib)
# 指定头文件搜索路径
include_directories(${PROJECT_SOURCE_DIR}/include)
# 编译main函数入口文件
add_executable(${PROJECT_NAME} main.cpp)
# # 将动态/静态库链接到项目中
target_link_libraries(${PROJECT_NAME} libdynamic_lib.dll)
2.3、修改main.cpp
main.cpp 代码如下
#include <iostream>
#include "library.h"
int main() {
std::cout << "Hello, World!" << std::endl;
hello();
return 0;
}
3、运行
点击绿色的按钮开始运行
运行后报错
解决方案:点击运行配置 -> EditConfigurations...
,之后会打开一个弹窗,在 Environment variables
那一栏输入以下内容
# PATH后面加上动态/静态链接库的目录路径
PATH=F:\cpp_projects\dynamic_project\lib
再次运行,成功了