Расширение Python: символы (символы) не найдены для архитектуры x86_64

Я хочу написать расширение python в c. Я работаю на 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 

Почему Python не поддерживает архитектуру X86_64 ?

3 Solutions collect form web for “Расширение Python: символы (символы) не найдены для архитектуры x86_64”

Две вещи:

  • Вам нужно связать ваше расширение как общий объект (вы пытаетесь связать исполняемый файл, поэтому компоновщик ищет main() );
  • Вам нужно связать статическую библиотеку Python ( -lpython ).
  1. Запросить путь env python с помощью следующих команд:
 $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

Благодаря @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

  • Pandon pandas: объединить два фрейма данных по индексу даты и общее значение столбца
  • Запросы Python - нет адаптеров подключения
  • min () on collections.defaultdict () возвращает максимальное количество
  • Python xlrd parse Excel xlsx в csv с преобразованием даты
  • Как оптимизировать вычисления по этой функции в numpy?
  • Как создать прозрачные виджеты с помощью Tkinter?
  • Как установить текст по умолчанию для виджета Tkinter Entry
  • Функция Python для получения t-статистики
  • Python - Рекомендуемая среда IDE для удаленного развития
  • Как создать TRIE в Python
  • Правильный способ использования аксессуаров в Python?
  • Python - лучший язык программирования в мире.