#include "hello.h" #include <stdio.h> void hello(const char *name) { printf("Hello %s!\n", name); } int factorial(int n) { if (n < 2) return 1; return factorial(n - 1) * n; } /* Compute the greatest common divisor */ int gcd(int x, int y) { int g = y; while (x > 0) { g = x; x = y % x; y = g; } return g; }
#ifndef _HELLO_H_ #define _HELLO_H_ #ifdef __cplusplus extern "C" { #endif void hello(const char *); int factorial(int n); int gcd(int x, int y); #ifdef __cplusplus } #endif #endif
結構體若是放在.h文件中和放在.c中寫法沒有區別,且重複定義會報錯。python
若是使用了c++特性(.c文件須要是.cpp文件),.h頭須要對應聲明,以下結構會更保險,c++
#ifndef __SAMPLE_H__ #define __SAMPLE_H__ #ifdef __cplusplus extern "C" { #endif /* 聲明主體 */ #ifdef __cplusplus } #endif #endif
gcc -shared -fPIC -o libhello.so hello.c
此時能夠看到so文件於文件夾下。bash
嘗試使用ctypes模塊載入庫,並調用函數,函數
from ctypes import cdll libhello= cdll.LoadLibrary("./libhello.so") libhello.hello('You') res1 = libhello.factorial(100) res2 = libhello.gcd(100, 2) print(libhello.avg) print(res1, res2)
>>> python hello.py
Hello Y!
<_FuncPtr object at 0x7f9aedc3d430>
0 23d
函數hello和咱們預想的不一致,僅僅輸出了首字母"Y",對於cookbook的其餘c函數實際上我也作了導入,可是數據格式c和python是須要轉換的,調用起來不是很容易的一件事,本篇重點在於成功導入python,以後的問題以後講。blog