ctypesを使用してPythonで非常に単純なCライブラリバインディングを作成しました。文字列を受け入れて文字列を返すだけです。
私はUbuntuで開発を行いましたが、すべて問題なく見えました。残念ながら、OSXではまったく同じコードが失敗します。私は完全に困惑しています。
私が抱えている問題を示す最小限のケースをまとめました。
main.py
import ctypes
# Compile for:
# Linux: `gcc -fPIC -shared hello.c -o hello.so`
# OSX: `gcc -shared hello.c -o hello.so`
lib = ctypes.cdll.LoadLibrary('./hello.so')
# Call the library
ptr = lib.hello("Frank")
data = ctypes.c_char_p(ptr).value # segfault here on OSX only
lib.free_response(ptr)
# Prove it worked
print data
こんにちはC
#include <stdlib.h>
#include <string.h>
// This is the actual binding call.
char* hello(char* name) {
char* response = malloc(sizeof(char) * 100);
strcpy(response, "Hello, ");
strcat(response, name);
strcat(response, "!\n");
return response;
}
// This frees the response memory and must be called by the binding.
void free_response(char *ptr) { free(ptr); }