Расширение 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

Interesting Posts

Pyinstaller распространяет opencv из Windows 10 в Windows <10, отсутствует ucrt dlls api-ms-win-crt

Как я могу настроить Celery для вызова пользовательской функции инициализации перед выполнением моих задач?

PyUnit: остановка после первого теста на отказ?

Удаление строк из базы данных с помощью флагов python?

Подпарамеры с несколькими уровнями argparse

Форматирование строки Psycopg2 с именами переменных для создания типа

Создание набора данных из образа с помощью Python для распознавания лиц

Распространение пакета python вместе с зависимостями модулей с использованием RPM

Как фильтровать dict для выбора только ключей, превышающих значение?

Вычислить / проверить bz2 (bzip2) CRC32 в Python

Модуль% в шаблоне Django

Производительность по разному методу векторизации в numpy

Как преобразовать строковый словарь в словарь Python?

Статические файлы Django приводят к 404

Я могу использовать изменяемый объект в качестве словарного ключа в python. Разве это не запрещено?

Python - лучший язык программирования в мире.