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
|
counter
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
Соберите библиотеку. Выходным файлом получится target/debug/libmylib.so (В зависимости от вашей ОС расширение .so, используемое в linux, может замениться на .dylib в macos или .dll в windows). Можем проверить наличие символа в библиотеке для функции через nm из пакета binutils:
|
Соберите библиотеку. Выходным файлом получится target/debug/libmylib.so (В зависимости от вашей ОС расширение .so, используемое в linux, может замениться на .dylib в macos или .dll в windows). Можем проверить наличие символа в библиотеке для функции через nm из пакета binutils:
|
||||||
```bash
|
```bash
|
||||||
# nm выведет весь список символов
|
# nm выведет весь список символов
|
||||||
@ -405,12 +406,44 @@ nm target/debug/libmylib.so | grep doublefast
|
|||||||
```
|
```
|
||||||
Попробуем использовать нашу функцию, к примеру, такой код в Python:
|
Попробуем использовать нашу функцию, к примеру, такой код в Python:
|
||||||
```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")
|
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.
|
Такое применение имеет практическую пользу: аналогичный код на rust выполняется в разы быстрее, чем код на python, поэтому много библиотек для python пишутся на C, а со становления rust популяным многие уже пишутся на rust.
|
||||||
### Сборка статической библиотеки
|
### Сборка статической библиотеки
|
||||||
Что собрать то же самое, но в статическую библиотеку, нужно в `crate-type` изменить `cdylib` на `staticlib` (либо можно оставить и то и то, тогда будут собираться обе версии библиотеки):
|
Что собрать то же самое, но в статическую библиотеку, нужно в `crate-type` изменить `cdylib` на `staticlib` (либо можно оставить и то и то, тогда будут собираться обе версии библиотеки):
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user