静态链接库和动态链接库

编程中函数的本质是把具有一定功能性代码整合起来,可以重复的使用。至于函数内部的实现,你可以认为就是一个黑箱。但是我得告诉你我这个黑箱中有什么功能。就像快递收发点一样,怎么运输的你不用管,但是我得有个目录告诉你有些什么选择和对应的收费标准。

c语言中,stdio等库就是这么个情况,把很多有用的函数封装在一起,成为一个库(静态和动态我们等会儿再说),库里有什么则通过stdio.h这个文件告诉你,同时stdio.h也告诉你了要以什么样的参数方式调用。

人们可以把一些函数封装成库,提供给用户服务。c语言就有很多这样的库,你写程序的时候,就可以调用c语言自带的这些库函数。编译的时候,你的c语言源代码会编译成.o文件,但是要做成exe文件,还需要把库里所有要用到的那些函数代码嵌入进来,这种方式就是静态的链接到了你的exe文件中。提供的这些库,就称呼为静态链接库。

而如果某些函数使用率非常的高,或者你自己脑回路清奇,或者乐意,你也可以把那些用到的函数不嵌入进来,只是告诉你的exe程序,需要用到某个库中的某个函数,在运行的时候才加载那个库,调用库里的函数。这样的方式就是动态链接库。

在windows下,静态链接库一般是lib为后缀名,动态链接库一般是dll为后缀名。

在linux下,静态链接库一般是a为后缀名,动态链接库一般是so为后缀名。

在mac os x 下,动态链接库一般是dylib为后缀名。

我们在julia中可以很方便的调用动态链接库里的函数。详情请见julia调用dll中的函数。

静态链接库和动态链接库是什么

动态链接库(Dynamic Link Library,DLL)是一种在多个程序之间共享代码和数据的可执行文件格式。DLL包含一组可重用的函数、类、变量和资源,可以被不同的应用程序或进程调用和使用。

与静态链接库(Static Link Library)不同,DLL在运行时才加载到内存中,并且可以由多个应用程序同时使用。这种共享的特性带来了一些优势:

节省内存空间:由于多个应用程序可以共享同一个DLL,所以不同的应用程序不需要在内存中加载相同的代码和数据,从而节省了内存空间。

代码和数据的更新和维护:如果需要更新DLL中的代码或数据,只需更新DLL本身,而不需要重新编译和链接所有使用该DLL的应用程序。这样可以简化代码的维护和更新过程。

提供标准化的功能和接口:通过使用DLL,可以将常用的功能和接口封装在一个共享的库中,使得多个应用程序可以共享这些标准化的功能,减少了代码冗余和重复开发。

在Windows操作系统中,DLL文件具有特定的文件扩展名 ".dll",并且可以通过动态链接方式进行加载和调用。应用程序可以使用特定的函数调用语法来调用DLL中的函数,从而实现对DLL中功能的使用。

需要注意的是,由于DLL是共享的,因此在使用DLL时需要注意版本兼容性和依赖关系。如果一个应用程序依赖于某个DLL的特定版本,那么必须确保该DLL的版本可用,并且正确配置应用程序的运行环境,以避免出现兼容性问题。

总之,动态链接库是一种方便共享代码和数据的可执行文件格式,它提供了灵活性、代码重用和资源共享的好处,被广泛用于软件开发中。

使用c语言,CMake工具,来个例子

当使用CMake构建动态链接库或静态链接库时,您需要编写CMakeLists.txt文件来描述构建过程。下面是一个示例,展示如何使用C语言生成一个动态链接库和一个静态链接库。

首先,创建一个名为mylib的文件夹,并在其中创建以下文件:

  1. CMakeLists.txt - 用于构建库的CMake文件。
  2. mylib.h - 库的头文件。
  3. mylib.c - 库的源代码文件。

确保将这些文件放在同一个文件夹中。

下面是CMakeLists.txt的内容:

cmake_minimum_required(VERSION 3.10)
project(mylib)

# 添加库的源文件
set(SOURCES mylib.c)

# 生成动态链接库
add_library(mylib_shared SHARED ${SOURCES})

# 生成静态链接库
add_library(mylib_static STATIC ${SOURCES})

# 设置库的输出名称
set_target_properties(mylib_shared PROPERTIES OUTPUT_NAME "mylib")
set_target_properties(mylib_static PROPERTIES OUTPUT_NAME "mylib")

# 设置库的安装路径
install(TARGETS mylib_shared mylib_static
        LIBRARY DESTINATION lib
        ARCHIVE DESTINATION lib)

# 设置头文件的安装路径
install(FILES mylib.h DESTINATION include)

在上述示例中,我们使用add_library命令来创建动态链接库和静态链接库。set_target_properties命令用于设置库的输出名称,这里设置为"mylib"。install命令用于指定库的安装路径和头文件的安装路径。

要构建库,可以按照以下步骤进行操作:

  1. 创建一个名为build的文件夹,并进入该文件夹。
  2. 打开终端,导航到build文件夹。
  3. 运行以下命令以生成构建文件:
cmake ..
  1. 运行以下命令以构建库:
cmake --build .

完成上述步骤后,将在build文件夹中生成动态链接库(libmylib.so)和静态链接库(libmylib.a)。

如果您希望安装库到系统路径中,可以运行以下命令(需要管理员权限):

sudo make install

这将把库文件和头文件安装到默认的系统路径(例如,/usr/local/lib和/usr/local/include)。

对应的c语言源文件

这里是一个示例的C源文件mylib.c,用于生成动态链接库和静态链接库:

#include "mylib.h"

int add(int a, int b) {
    return a + b;
}

int subtract(int a, int b) {
    return a - b;
}

在上述示例中,我们定义了两个简单的函数:add和subtract。这些函数的实现位于mylib.c文件中,并在mylib.h文件中进行了声明。

您可以将这个mylib.c文件放在与CMakeLists.txt相同的目录中,然后按照上述说明使用CMake来构建动态链接库和静态链接库。

头文件呢?

当生成动态链接库或静态链接库时,您需要一个头文件来声明库中的函数和数据结构。在上一个示例中,我忘记包含头文件mylib.h的内容,非常抱歉。以下是正确的mylib.h头文件内容:

#ifndef MYLIB_H
#define MYLIB_H

int add(int a, int b);
int subtract(int a, int b);

#endif  // MYLIB_H

请将上述代码保存到名为mylib.h的文件中,并确保与CMakeLists.txtmylib.c文件位于同一个目录中。

这个头文件声明了两个函数:addsubtract,这些函数的实现位于mylib.c文件中。通过包含这个头文件,其他源文件就可以使用库中的函数。

希望这次提供的信息对您有所帮助!如果您还有其他问题,请随时提问。

如何调用

当调用生成的动态链接库或静态链接库时,您需要创建一个主函数文件,并使用CMake来构建项目。下面是一个示例,展示如何编写主函数文件和CMakeLists.txt文件来调用生成的库。

首先,创建一个名为myapp的文件夹,并在其中创建以下文件:

  1. CMakeLists.txt - 用于构建应用程序的CMake文件。
  2. main.c - 主函数文件,用于调用库中的函数。

确保将这些文件放在同一个文件夹中。

下面是CMakeLists.txt的内容:

cmake_minimum_required(VERSION 3.10)
project(myapp)

# 添加库的源文件
set(SOURCES main.c)

# 生成可执行文件
add_executable(myapp ${SOURCES})

# 链接动态链接库
target_link_libraries(myapp PRIVATE mylib)

# 设置库的搜索路径
link_directories(/path/to/mylib)

# 设置库的头文件路径
include_directories(/path/to/mylib)

# 设置可执行文件的安装路径
install(TARGETS myapp DESTINATION bin)

在上述示例中,我们使用add_executable命令创建可执行文件,并使用target_link_libraries命令将生成的库(这里假设为mylib)链接到可执行文件中。通过link_directoriesinclude_directories命令,我们设置库的搜索路径和头文件路径。

要构建应用程序,可以按照以下步骤进行操作:

  1. 创建一个名为build的文件夹,并进入该文件夹。
  2. 打开终端,导航到build文件夹。
  3. 运行以下命令以生成构建文件:
cmake ..
  1. 运行以下命令以构建应用程序:
cmake --build .

完成上述步骤后,将在build文件夹中生成可执行文件(myapp)。

如果您希望安装应用程序到系统路径中,可以运行以下命令(需要管理员权限):

sudo make install

这将把可执行文件安装到默认的系统路径(例如,/usr/local/bin)。

请注意,您需要根据实际情况修改link_directoriesinclude_directories中的路径,以确保正确链接和包含库的头文件。

使用clion来一个step by step生成动态链接库的例子

使用CLion来生成动态链接库的步骤如下:

步骤 1: 创建一个新的CMake项目

  • 打开CLion并选择 "Create New Project"。
  • 在对话框中选择 "C Executable" 并点击 "Next"。
  • 为项目选择一个适当的名称和位置,并点击 "Create".

步骤 2: 创建源文件

  • 在项目中创建一个新的C源文件,例如 mylib.c
  • 编写您的库的实现代码。

以下是一个简单的示例 mylib.c

#include "mylib.h"

int add(int a, int b) {
    return a + b;
}

int subtract(int a, int b) {
    return a - b;
}

步骤 3: 创建头文件

  • 在项目中创建一个新的头文件,例如 mylib.h
  • 在头文件中声明您的库的函数和数据结构。

以下是 mylib.h 的内容:

#ifndef MYLIB_H
#define MYLIB_H

int add(int a, int b);
int subtract(int a, int b);

#endif  // MYLIB_H

步骤 4: 编辑CMakeLists.txt

  • 在项目根目录下找到 CMakeLists.txt 文件,并编辑它。

以下是一个基本的 CMakeLists.txt 示例:

cmake_minimum_required(VERSION 3.10)
project(mylib)

# 添加库的源文件
set(SOURCES mylib.c)

# 生成动态链接库
add_library(mylib SHARED ${SOURCES})

# 设置库的安装路径
install(TARGETS mylib LIBRARY DESTINATION lib)
install(FILES mylib.h DESTINATION include)

步骤 5: 配置和构建项目

  • 打开CLion中的项目。
  • 在CLion界面的底部工具栏,点击 "Reload CMake Project" 以加载新的CMake配置。
  • 在CLion界面的顶部工具栏,点击 "Build" 按钮构建项目。

完成上述步骤后,CLion将使用CMake构建您的项目,并在构建过程中生成动态链接库。生成的动态链接库将位于 build/lib 目录中。

如果您希望安装库到系统路径中,可以在 CMakeLists.txt 中添加以下安装规则:

install(TARGETS mylib LIBRARY DESTINATION /usr/local/lib)
install(FILES mylib.h DESTINATION /usr/local/include)

运行 Reload CMake ProjectBuild 命令后,库将安装到 /usr/local/lib/usr/local/include 路径中。

这样,您就可以在CLion中使用CMake逐步生成动态链接库了。如果您有任何进一步的问题,请随时提问。

调用如何进行?

以下是在CLion中调用动态链接库的步骤:

步骤 1: 创建一个新的CMake项目

  • 打开CLion并选择 "Create New Project"。
  • 在对话框中选择 "C Executable" 并点击 "Next"。
  • 为项目选择一个适当的名称和位置,并点击 "Create".

步骤 2: 创建源文件

  • 在项目中创建一个新的C源文件,例如 main.c
  • 编写您的主函数代码。

以下是一个简单的示例 main.c

#include <stdio.h>
#include "mylib.h"

int main() {
    int result = add(5, 3);
    printf("Addition result: %d\n", result);

    result = subtract(5, 3);
    printf("Subtraction result: %d\n", result);

    return 0;
}

步骤 3: 添加动态链接库的引用

  • 打开项目的 CMakeLists.txt 文件。
  • add_executable 行之前,添加 add_library 行来引用动态链接库。

以下是修改后的 CMakeLists.txt 示例:

cmake_minimum_required(VERSION 3.10)
project(myapp)

# 引用动态链接库
add_library(mylib SHARED IMPORTED)

# 设置动态链接库的路径
set_target_properties(mylib PROPERTIES IMPORTED_LOCATION /path/to/mylib.so)

# 添加可执行文件
add_executable(myapp main.c)

# 链接动态链接库
target_link_libraries(myapp PRIVATE mylib)

在上述示例中,您需要将 /path/to/mylib.so 替换为实际的动态链接库文件路径。

步骤 4: 配置和构建项目

  • 打开CLion中的项目。
  • 在CLion界面的底部工具栏,点击 "Reload CMake Project" 以加载新的CMake配置。
  • 在CLion界面的顶部工具栏,点击 "Build" 按钮构建项目。

完成上述步骤后,CLion将使用CMake构建您的项目,并在构建过程中将动态链接库引用到可执行文件中。然后,您可以在CLion中运行项目,查看调用动态链接库函数的结果。

请注意,您需要将 /path/to/mylib.so 替换为实际的动态链接库文件路径,并确保动态链接库文件存在。

能否简单补充一下CMake是什么?

当然可以!CMake是一个开源的跨平台构建系统,用于管理软件项目的构建过程。它使用名为CMakeLists.txt的文本文件来描述项目的构建配置,并根据此配置生成适合各种构建工具(如make、Ninja等)的构建文件。

CMake的主要优势在于它提供了一种简化和抽象构建过程的方式,使得开发者可以更方便地管理复杂的项目结构和依赖关系。通过CMake,您可以编写平台无关的构建脚本,这意味着您可以在不同的操作系统和编译器上使用相同的CMake配置来构建项目。

CMake使用类似于编程语言的语法,提供了丰富的命令和变量,用于定义项目的源文件、目标、库依赖关系、编译选项等。通过编写CMakeLists.txt文件,您可以描述项目的组织结构、源代码文件、库的构建方式等细节,从而使得构建过程更加灵活和可定制。

在使用CMake构建项目时,通常的步骤是:创建CMakeLists.txt文件,定义源文件和目标,指定库的依赖关系和链接选项,然后运行CMake来生成构建文件,最后使用构建工具进行实际的构建操作。

CMake已被广泛使用,并且许多开源项目和跨平台项目都使用CMake来管理其构建过程,使得项目在不同的平台和编译器上更容易构建和交付。

作业

请自己完成静态链接库及其调用。使用CLion,CMake。

视频链接

动态链接库和静态链接库