静态链接库和动态链接库
静态链接库和动态链接库
编程中函数的本质是把具有一定功能性代码整合起来,可以重复的使用。至于函数内部的实现,你可以认为就是一个黑箱。但是我得告诉你我这个黑箱中有什么功能。就像快递收发点一样,怎么运输的你不用管,但是我得有个目录告诉你有些什么选择和对应的收费标准。
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
的文件夹,并在其中创建以下文件:
CMakeLists.txt
- 用于构建库的CMake文件。mylib.h
- 库的头文件。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
命令用于指定库的安装路径和头文件的安装路径。
要构建库,可以按照以下步骤进行操作:
- 创建一个名为
build
的文件夹,并进入该文件夹。 - 打开终端,导航到
build
文件夹。 - 运行以下命令以生成构建文件:
cmake ..
- 运行以下命令以构建库:
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.txt
和mylib.c
文件位于同一个目录中。
这个头文件声明了两个函数:add
和subtract
,这些函数的实现位于mylib.c
文件中。通过包含这个头文件,其他源文件就可以使用库中的函数。
希望这次提供的信息对您有所帮助!如果您还有其他问题,请随时提问。
如何调用
当调用生成的动态链接库或静态链接库时,您需要创建一个主函数文件,并使用CMake来构建项目。下面是一个示例,展示如何编写主函数文件和CMakeLists.txt文件来调用生成的库。
首先,创建一个名为myapp
的文件夹,并在其中创建以下文件:
CMakeLists.txt
- 用于构建应用程序的CMake文件。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_directories
和include_directories
命令,我们设置库的搜索路径和头文件路径。
要构建应用程序,可以按照以下步骤进行操作:
- 创建一个名为
build
的文件夹,并进入该文件夹。 - 打开终端,导航到
build
文件夹。 - 运行以下命令以生成构建文件:
cmake ..
- 运行以下命令以构建应用程序:
cmake --build .
完成上述步骤后,将在build
文件夹中生成可执行文件(myapp)。
如果您希望安装应用程序到系统路径中,可以运行以下命令(需要管理员权限):
sudo make install
这将把可执行文件安装到默认的系统路径(例如,/usr/local/bin)。
请注意,您需要根据实际情况修改link_directories
和include_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 Project
和 Build
命令后,库将安装到 /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。