В настоящее время я изучаю интерфейс Python и C (например, в данном случае с cffi). Я понял, что «режим вне линии» означает, что C -код был скомпилирован с общим объектом во время установки, а режим в строке означает, что это сделано во время импорта.
Я борюсь с тем, как распознать режим API против API в cffi. Является ли следующий MVCE примером для ABI или API?
MVCE
libfib. cpp
int fib(int n) {
int a = 0, b = 1, i, tmp;
if (n <= 1) {
return n;
}
for (int i = 0; i < n - 1; i++) {
tmp = a + b;
a = b;
b = tmp;
}
return b;
}
extern "C" {
extern int cffi_fib(int n) {
return fib(n);
}
}
Скомпилировать с g++ -o ./libfib.so ./libfib.cpp -fPIC -shared
import cffi
ffi = cffi.FFI()
ffi.cdef("int cffi_fib(int n);")
C = ffi.dlopen("./libfib.so")
for i in range(10):
print(f"{i}: {C.cffi_fib(i)}")