Ошибки Cython Link для OSX - PullRequest
       8

Ошибки Cython Link для OSX

1 голос
/ 05 апреля 2019

У меня очень похожая проблема с этим ТАК ;однако после реализации предложенного исправления я все еще получаю следующую ошибку.

Я пытаюсь скомпилировать файл C, сгенерированный Cython.

cython ConnectFour.pyx --embed

Я пытаюсь скомпилироватьмой c файл выглядит так:

gcc -I /usr/local/Cellar/python3/3.7.0/Frameworks/Python.framework/Versions/3.7/Headers -o ConnectFour ConnectFour.c

Однако я получаю следующие ошибки:

Undefined symbols for architecture x86_64:
  "_PyBaseObject_Type", referenced from:
      ___Pyx_InBases in ConnectFour-3c26d7.o
  "_PyBytes_FromStringAndSize", referenced from:
      ___pyx_pymod_exec_ConnectFour in ConnectFour-3c26d7.o
      ___Pyx_InitStrings in ConnectFour-3c26d7.o
  "_PyCFunction_NewEx", referenced from:
      ___pyx_pymod_exec_ConnectFour in ConnectFour-3c26d7.o
  "_PyCFunction_Type", referenced from:
      ___Pyx_PyObject_CallOneArg in ConnectFour-3c26d7.o
      ___Pyx_PyObject_CallNoArg in ConnectFour-3c26d7.o
      ___Pyx_PyObject_Call2Args in ConnectFour-3c26d7.o
      ___Pyx_PyCFunction_FastCall in ConnectFour-3c26d7.o
      ___pyx_pf_11ConnectFour_36eval_heuristic_score in ConnectFour-3c26d7.o
      ___pyx_pf_11ConnectFour_38list_valid_col_idxs in ConnectFour-3c26d7.o
      ___pyx_pf_11ConnectFour_40deep_copy_board in ConnectFour-3c26d7.o
      ...
  "_PyCode_New", referenced from:
      ___Pyx_InitCachedConstants in ConnectFour-3c26d7.o
      ___Pyx_CreateCodeObjectForTraceback in ConnectFour-3c26d7.o
  "_PyDict_Copy", referenced from:
      ___pyx_pw_11ConnectFour_7profile_1wrapper in ConnectFour-3c26d7.o
      ___pyx_pw_11ConnectFour_5timer_1wrapper in ConnectFour-3c26d7.o
  "_PyDict_GetItemString", referenced from:
      ___pyx_pymod_exec_ConnectFour in ConnectFour-3c26d7.o
  "_PyDict_GetItemWithError", referenced from:
      ___Pyx_PyDict_GetItem in ConnectFour-3c26d7.o
  "_PyDict_New", referenced from:
      ___pyx_pymod_exec_ConnectFour in ConnectFour-3c26d7.o
      ___Pyx_Import in ConnectFour-3c26d7.o
      ___Pyx_CyFunction_get_dict in ConnectFour-3c26d7.o
      ___Pyx_CyFunction_get_annotations in ConnectFour-3c26d7.o
      ___pyx_pf_11ConnectFour_28count_players in ConnectFour-3c26d7.o
      ___pyx_pf_11ConnectFour_52num_in_a_row in ConnectFour-3c26d7.o

Я появляется на основе это и это ТАК сообщение, что мне не хватает некоторых библиотечных ссылок?Поэтому я попробовал следующее.

gcc -I /usr/local/Cellar/python3/3.7.0/Frameworks/Python.framework/Versions/3.7/Headers -o ConnectFour ConnectFour.c -l/usr/local/Cellar/python3/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/libpython3.7.dylib

И теперь я получаю ошибку lib not found.

ld: библиотека не найдена для -l / usr / local / Cellar / python3/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/libpython3.7.dylib

Я совершенно не в себе, читая все эти посты SO (впервые имею дело сC) поэтому будем благодарны за пошаговые ответы.

Что мне нужно иметь для того, чтобы скомпилировать и затем запустить мой C-файл без ошибок?

Я знаю, что мои заголовки расположены в /usr/local/Cellar/python3/3.7.0/Frameworks/Python.framework/Versions/3.7/Headers, а библиотека расположена в /usr/local/Cellar/python3/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/libpython3.7.dylib

Я на OSX и я установил Python, используя Homebrew.

Ответы [ 2 ]

1 голос
/ 08 апреля 2019

Итак, я прочитал этот пост более внимательно по предложениям @ ead, и это оказалось большой помощью. Пишем следующее для тех, кто сталкивается с подобной проблемой.

После запуска cython ConnectFour.pyx --embed моей целью было скомпилировать файл .c в исполняемый файл. Это означает, что (1) необходимо создать объектные файлы .o и (2) преобразовать объектный файл .o в исполняемый файл, который можно запустить следующим образом: ./MyExecutable

Шаг 1. Создание .o объектных файлов

Нам нужно выполнить следующее, но проблема, с которой я столкнулся, заключалась в том, чтобы узнать, как получить мои флаги.

gcc -c hello.c -o hello.o <our cflags>

Поскольку я установил Python через Homebrew, Python и его заголовочные файлы находятся в следующем каталоге для меня.

/usr/local/Cellar/python3/3.7.0/Frameworks/Python.framework/Versions/3.7/bin/

Чтобы сгенерировать для меня cflags - мне нужно было выполнить следующую команду. Обратите внимание на флаг --cflags. Команда запускает утилиту конфигурации для моей установки Python 3, которая установлена ​​в странном каталоге (поскольку я установил Python через Homebrew).

/usr/local/Cellar/python3/3.7.0/Frameworks/Python.framework/Versions/3.7/bin/python3.7-config
--cflags

Ниже приведен фрагмент флагов, сгенерированных для меня.

-I/usr/local/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/include/python3.7m -I/usr/local.......etc etc.

Используя флаги, я запустил следующее для генерации моих объектных файлов.

gcc -c ConnectFour.c -o ConnectFour.o -I/usr/local/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/include/python3.7m -I/...etc etc.

Шаг 2. Преобразование объектного файла в исполняемый файл

Чтобы сгенерировать исполняемый файл, нам нужно выполнить следующее.

gcc main.o hello.o -o prog <our ldflags>

Чтобы сгенерировать флаги ld, на этот раз мне нужно было выполнить следующую команду. Мы снова используем утилиту конфигурации, но на этот раз с --ldflags.

/usr/local/Cellar/python3/3.7.0/Frameworks/Python.framework/Versions/3.7/bin/python3.7-config --ldflags

Это сгенерировало для меня следующие флаги.

-L/usr/local/opt/python/Frameworks/Python.framework/Versions/3.7/lib/python3.7/config-3.7m-darwin -lpython3.7m ...etc. etc.

Используя эти флаги, я запустил следующую команду для генерации моего исполняемого файла.

gcc ConnectFour.o -o ConnectFour -L/usr/local/opt/python/Frameworks/Python.framework/Versions/3.7/lib/python3.7/config-3.7m-darwin -lpython3.7m ...etc. etc.

Готово! Выскочил исполняемый файл, и я запустил его, как и любой другой исполняемый файл C.

Особая благодарность @ead за указание в правильном направлении.

1 голос
/ 06 апреля 2019

Попробуйте запустить

gcc -I /usr/local/Cellar/python3/3.7.0/Frameworks/Python.framework/Versions/3.7/Headers -o ConnectFour ConnectFour.c -L/usr/local/Cellar/python3/3.7.0/Frameworks/Python.framework/Versions/3.7 -lpython3.7

Флаг -L добавляет этот каталог к ​​пути поиска, а затем использует -l для ссылки (поскольку -l, кажется, не принимает абсолютные пути), в Linux по крайней мереПрефикс и расширение lib опускаются при использовании -l, хотя я никогда не использовал MacOSX, поэтому попробуйте разные комбинации, если это не сработало.

...