vault backup: 2025-12-14 09:57:29

This commit is contained in:
akulij 2025-12-14 09:57:29 +08:00
parent b9687e749d
commit c64e01ea4d

View File

@ -397,6 +397,7 @@ pub extern unsafe "C" fn count_case_ascii(c: Cased) -> u32 {
counter
}
```
Соберите библиотеку. Выходным файлом получится target/debug/libmylib.so (В зависимости от вашей ОС расширение .so, используемое в linux, может замениться на .dylib в macos или .dll в windows). Можем проверить наличие символа в библиотеке для функции через nm из пакета binutils:
```bash
# nm выведет весь список символов
@ -405,12 +406,44 @@ nm target/debug/libmylib.so | grep doublefast
```
Попробуем использовать нашу функцию, к примеру, такой код в Python:
```python
from ctypes import cdll
from ctypes import cdll, c_char_p, c_bool, c_uint32, Structure
# Load the Rust shared library
mylib = cdll.LoadLibrary("target/debug/libmylib.dylib")
print(mylib.doublefast(8))
# Mirror the Cased struct
class Cased(Structure):
_fields_ = [
("cstring", c_char_p),
("case", c_bool),
]
# Declare function signature
mylib.count_case_ascii.argtypes = [Cased]
mylib.count_case_ascii.restype = c_uint32
# Example usage
s = b"Hello WORLD abc XYZ"
# Count uppercase letters
upper = Cased(
cstring=s,
case=True,
)
upper_count = mylib.count_case_ascii(upper)
# Count lowercase letters
lower = Cased(
cstring=s,
case=False,
)
lower_count = mylib.count_case_ascii(lower)
print("Uppercase count:", upper_count)
print("Lowercase count:", lower_count)
```
Успешно выведет 16
*Информация о том, какие типы функция принимает и выдает не сохраняется в библиотеке, просто по дефолту python считает, что функция принимает и выдает i32*
Успешно выведет количество знаков
Такое применение имеет практическую пользу: аналогичный код на rust выполняется в разы быстрее, чем код на python, поэтому много библиотек для python пишутся на C, а со становления rust популяным многие уже пишутся на rust.
### Сборка статической библиотеки
Что собрать то же самое, но в статическую библиотеку, нужно в `crate-type` изменить `cdylib` на `staticlib` (либо можно оставить и то и то, тогда будут собираться обе версии библиотеки):