静态库在编译时将库的代码静态链接到可执行文件中。动态库在运行时将库的代码加载到内存中,并在需要时链接到可执行文件。动态库的代码存储在单独的文件中。相关代码:dynamic-link-static-link
c++相关
使用静态库与动态库时系统位数需一致。x86系统的库,x64下无法使用:
c++中,shared为动态库 dll,static为静态库 lib。
windows clion 下,调用静态库需配置cmake:
效果图:
C++动态库:在Windows平台上,当你编译动态链接库(DLL)时,需要使用 __declspec(dllexport)
来明确指定要导出的函数或数据。这告诉编译器将这些函数或数据标记为可在DLL中供其他程序使用。如果你不使用 __declspec(dllexport)
或其他等效的方法来标记这些函数,编译器默认不会导出它们。加载DLL的程序需要与DLL使用相同的函数签名(包括参数类型和返回类型)。
效果图:
__declspec(dllexport)
: 用于指定一个函数或数据在编译为动态链接库 (DLL) 时应该被导出。这使得其他程序可以链接并调用 DLL 中的函数或访问导出的数据。通常用在函数或数据的声明前。#include "library.h" 动态库也需要加上,否则build后会少生成lib文件。
rust相关
rust 中使用c++/rust静态库和动态库
kind
是 Rust 中用于链接库的一个属性,它指定了链接库的类型。在 Rust 中,常见的 kind
包括:
-
static:这是静态链接库的默认类型。它会将库的代码完整地嵌入到可执行文件中,使得可执行文件更大。这意味着你不需要在运行时加载这个库,但会增加可执行文件的大小。
-
dylib:这是动态链接库的默认类型。它会创建一个独立的动态链接库文件,可执行文件在运行时加载这个库。这会减小可执行文件的大小,但需要确保库文件在运行时可用。
-
cdylib:这个类型类似于
dylib
,但它具有 C ABI(Application Binary Interface)。这意味着库的接口与 C 相兼容,因此可以从其他语言中调用这个库。 -
rlib:这是 Rust 库的一种格式,通常用于在 Rust 项目之间共享代码。它不是一个动态链接库,而是一个二进制的 Rust 库文件
c++ 中使用rust静态库和动态库
rust中,创建库文件的类型主要是由crate-type
决定,以下是一些常见的 crate-type
类型:
-
bin:这是默认的 crate 类型,用于生成可执行文件。当您的 Rust 项目包含
main
函数并且需要生成可执行文件时,通常会使用此 crate 类型。 -
rlib:这是一个 Rust 静态库,用于在其他 Rust 项目中进行静态链接。您可以使用此 crate 类型将 Rust 代码打包成一个静态库,供其他 Rust 项目使用。
-
cdylib:这是一个 C 兼容的动态链接库(.dll 文件),可供其他编程语言(如 C、C++)调用。如果要将 Rust 代码导出为动态链接库以供其他编程语言使用,通常会选择此 crate 类型。
-
dylib:这是一个 Rust 动态链接库,仅供 Rust 项目使用。与 cdylib 不同,dylib 生成的库仅供 Rust 项目中的动态链接使用。
-
staticlib:这是一个 Rust 静态链接库,仅供 Rust 项目使用。它与 rlib 类似,但生成的库用于静态链接,而不是动态链接。
-
proc-macro:这是一个用于编译时代码生成的 crate 类型。通常,这些 crate 包含宏,可以在编译时生成代码。
文章评论