pythonからいくつかのpgcrypto関数を呼びたいと思います。すなわちpx_crypt。私はそれがリンクする正しいオブジェクトファイルを把握しているように見えることはできません。ここでPythonからpgcryptoにバインドする
は私のコードです:
#include <Python.h>
#include "postgres.h"
#include "pgcrypto/px-crypt.h"
static PyObject*
pgcrypt(PyObject* self, PyObject* args)
{
const char* key;
const char* setting;
if (!PyArg_ParseTuple(args, "ss", &key, &setting))
return NULL;
return Py_BuildValue("s", px_crypt(key, setting, "", 0));
}
static PyMethodDef PgCryptMethods[] =
{
{"pgcrypt", pgcrypt, METH_VARARGS, "Call pgcrypto's crypt"},
{NULL, NULL, 0, NULL}
};
PyMODINIT_FUNC
initpypgcrypto(void)
{
(void) Py_InitModule("pypgcrypto", PgCryptMethods);
}
とgccコマンドと出力:
x86_64-linux-gnu-gcc -pthread -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -fno-strict-aliasing -D_FORTIFY_SOURCE=2 -g -fstack-protector-strong -Wformat -Werror=format-security -fPIC -I/home/ionut/github/postgres/contrib/ -I/usr/include/postgresql/9.4/server/ -I/usr/include/python2.7 -c pypgcrypto.c -o build/temp.linux-x86_64-2.7/pypgcrypto.o
x86_64-linux-gnu-gcc -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions -Wl,-z,relro -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -D_FORTIFY_SOURCE=2 -g -fstack-protector-strong -Wformat -Werror=format-security -Wl,-z,relro -D_FORTIFY_SOURCE=2 -g -fstack-protector-strong -Wformat -Werror=format-security build/temp.linux-x86_64-2.7/pypgcrypto.o /usr/lib/postgresql/9.4/lib/pgcrypto.so -lpgport -lpq -o build/lib.linux-x86_64-2.7/pypgcrypto.so
エラーは次のとおりです。私はこれを得たコメントの一つから
python -c "import pypgcrypto; print pypgcrypto.pgcrypt('foo', 'bar')"
Traceback (most recent call last):
File "<string>", line 1, in <module>
ImportError: /usr/lib/postgresql/9.4/lib/pgcrypto.so: undefined symbol: InterruptPending
'InterruptPending'について、このシンボルはどのライブラリに属していますか? – fluter
Postgres。私はそれをhttp://doxygen.postgresql.org/globals_8c_source.html#l00029で見つけることができますが、リンクする方法はわかりません。 – Oin
2つの質問、1.それはなぜpx_cryptであるべきですか? * libssl.so *は使用できません。 2. 'px_crypt'は実行時に' dlsym() 'とpostgresqlによって読み込まれ、' InterruptPending'は例えば呼び出し側で定義されたグローバル変数でしょうか? –