1

cでPython拡張機能を書きたいです。私はMacで作業していますが、ここからコードを取得しました:

#include <Python.h>

static PyObject* say_hello(PyObject* self, PyObject* args)
{
    const char* name;

    if (!PyArg_ParseTuple(args, "s", &name))
        return NULL;

    printf("Hello %s!\n", name);

    Py_RETURN_NONE;
}

static PyMethodDef HelloMethods[] =
{
     {"say_hello", say_hello, METH_VARARGS, "Greet somebody."},
     {NULL, NULL, 0, NULL}
};

PyMODINIT_FUNC

inithello(void)
{
     (void) Py_InitModule("hello", HelloMethods);
}

私はそれをコンパイルします:

gcc -c -o py_module.o py_module.c -I/Library/Frameworks/Python.framework/Versions/2.7/include/python2.7/
gcc -o py_module py_module.o -I/Library/Frameworks/Python.framework/Versions/2.7/include/python2.7/ -lm

しかし、私はこのエラーを受け取ります:

Undefined symbols for architecture x86_64:
  "_PyArg_ParseTuple", referenced from:
      _say_hello in py_module.o
  "_Py_InitModule4_64", referenced from:
      _inithello in py_module.o
  "__Py_NoneStruct", referenced from:
      _say_hello in py_module.o
  "_main", referenced from:
      start in crt1.10.6.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
make: *** [py_module] Error 1

X86_64Pythonがアーキテクチャをサポートしないのはなぜですか?

4

3 に答える 3

8

2つのこと:

  • 拡張機能を共有オブジェクトとしてリンクする必要があります(実行可能ファイルをリンクしようとしているため、リンカーが探していmain()ます)。
  • Python静的ライブラリ()に対してリンクする必要があります-lpython
于 2013-03-26T07:49:48.057 に答える
4
  1. 次のコマンドを使用して、Pythonのenvパスをクエリします。
$python-config --includes
-I/usr/include/python2.6 -I/usr/include/python2.6
$python-config --ldflags
-lpthread -ldl -lutil -lm -lpython2.6
  1. .oファイルを生成します:

$ g ++ -fPIC -c -I / usr / include / python2.6 -I / usr / include / python2.6 xx.cpp

  1. .soファイルを生成します。

g ++ -shared xx.o -o xx.so

于 2015-03-26T07:05:05.070 に答える
1

@NPE @glglglに感謝し、anatolyは私のMakefileです:

DIR=/Library/Frameworks/Python.framework/Versions/2.7/include/python2.7/
CC=gcc
CFLAGS=-I$(DIR)
ODIR=.

LIBS_DIR=/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/config/
LIBS=-lpython2.7

_DEPS =
DEPS = $(patsubst %,$(IDIR)/%,$(_DEPS))

_OBJ = py_module.o
OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ))


$(ODIR)/%.o: %.c $(DEPS)
        $(CC) -c -o $@ $< $(CFLAGS)

py_module: $(OBJ)
        gcc -shared $^ $(CFLAGS) -I$(LIBS_DIR) $(LIBS) -o $@

.PHONY: clean

clean:
        rm -f $(ODIR)/*.o *~ core $(INCDIR)/*~

makefileテンプレートはここから取得されました。

パスを見つけるために、python-config --ldflags

python-config --includes

于 2013-03-26T09:00:09.870 に答える