vault backup: 2025-12-14 09:57:29
This commit is contained in:
parent
b9687e749d
commit
c64e01ea4d
@ -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` (либо можно оставить и то и то, тогда будут собираться обе версии библиотеки):
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user