CLion 生成静态链接库、动态链接库,调用静态链接库、动态链接库

发布时间:2023-07-07 21:33:58 作者:yexindonglai@163.com 阅读(1889)

动态链接库和静态链接库的区别

动态链接库和静态链接库是两种不同的库文件,它们在编译和运行时的行为有所不同。以下是它们的区别:

静态链接库:

  • 静态链接库在编译时被链接到可执行文件中,因此可执行文件包含了库的代码和数据。
  • 静态链接库的文件扩展名通常是 .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 代码如下

  1. #ifndef DYNAMIC_LIB_LIBRARY_H
  2. #define DYNAMIC_LIB_LIBRARY_H
  3. void hello();
  4. #endif //DYNAMIC_LIB_LIBRARY_H

library.cpp 代码如下

  1. #include "library.h"
  2. #include <iostream>
  3. void hello() {
  4. std::cout << "Hello, dynamic lib" << std::endl;
  5. }

1.3、修改编译配置

CMakeLists.txt文件内容如下

  1. cmake_minimum_required(VERSION 3.23)
  2. project(dynamic_lib)
  3. set(CMAKE_CXX_STANDARD 11)
  4. # 生成 动态的 xxx.dll 文件
  5. add_library(dynamic_lib SHARED library.cpp)
  6. # 这样也可以
  7. #add_library(dynamic_lib SHARED library.cpp library.h)

注意以下这行代码,SHARED 表示动态链接库,STATIC 表示静态链接库

  1. add_library(dynamic_lib SHARED library.cpp) # 动态链接库
  2. add_library(dynamic_lib STATIC library.cpp) # 静态链接库

然后我们点击这个圆圈,表示加载 Cmake 项目,会运行CMakeLists.txt文件中代码,执行完成后会在项目根目录生成一个名为cmake-build-debug的目录,其实项目创建好之后会自动加载一次,在这边为了保险起见,在执行一次;

1.4、构建

开始构建,有三种方式可以构建

  1. 依次点击 -> Build -> Build ‘xxx’
  2. 点击下图中绿色的锤子
  3. 输入快捷键 Ctrl + F9

构建后,动态链接库会生成 xxx.dll 文件

静态链接库会生成 xxx.a文件

到这一步,动态/静态链接库就已经生成了

2、调用动/静态链接库

2.1、创建项目

依次点击 File -> New -> Project… -> C++ Executable

创建后的结构目录如下

然后我们将刚刚生成的动态/静态链接库和头文件放进去

  • 将头文件放入 include 目录
  • 将动态/静态链接库dll放入 lib 目录

放完后的目录交给如下

2.2、修改编译配置

接下来修改 CMakeLists.txt 文件

  1. # 指定lib目录
  2. link_directories(${PROJECT_SOURCE_DIR}/lib)
  3. # 指定头文件搜索路径
  4. include_directories(${PROJECT_SOURCE_DIR}/include)
  5. # 编译main函数入口文件
  6. add_executable(${PROJECT_NAME} main.cpp)
  7. # # 将动态/静态库链接到项目中
  8. target_link_libraries(${PROJECT_NAME} libdynamic_lib.dll)

2.3、修改main.cpp

main.cpp 代码如下

  1. #include <iostream>
  2. #include "library.h"
  3. int main() {
  4. std::cout << "Hello, World!" << std::endl;
  5. hello();
  6. return 0;
  7. }

3、运行

点击绿色的按钮开始运行

运行后报错

解决方案:点击运行配置 -> EditConfigurations... ,之后会打开一个弹窗,在 Environment variables 那一栏输入以下内容

  1. # PATH后面加上动态/静态链接库的目录路径
  2. PATH=F:\cpp_projects\dynamic_project\lib

再次运行,成功了

关键字c++