OSX 的 Cython 链接错误

我有一个与此SO 帖子非常相似的问题;但是,在那里实施了建议的修复程序后 - 我仍然收到以下错误。


我正在尝试编译由 Cython 生成的 C 文件。


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

      ...

我是基于这个和这个SO 帖子出现的,我错过了一些图书馆链接?所以我尝试了以下方法。


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 上,我使用 Homebrew 安装了 Python。


偶然的你
浏览 163回答 2
2回答

MYYA

所以我最终按照@ead 的建议更仔细地阅读了这篇 SO 帖子,结果证明这是一个很大的帮助。为遇到类似问题的人编写以下内容。运行后,cython ConnectFour.pyx --embed我的目标是将 .c 文件编译为可执行文件。这意味着 (1) 需要构建 .o 目标文件和 (2) 将 .o 目标文件转换为可运行的可执行文件,如下所示:./MyExecutable步骤 1. 构建 .o 目标文件我们需要运行以下命令,但我遇到的问题是找出如何获取我的标志。gcc&nbsp;-c&nbsp;hello.c&nbsp;-o&nbsp;hello.o&nbsp;<our&nbsp;cflags>由于我是通过 Homebrew 安装 Python 的,因此 Python 及其头文件位于以下目录中。/usr/local/Cellar/python3/3.7.0/Frameworks/Python.framework/Versions/3.7/bin/为了为我生成 cflags - 我必须运行以下命令。请注意 --cflags 标志。该命令为我的 Python 3 安装运行配置实用程序,该实用程序安装在奇怪的目录中(因为我通过 Homebrew 安装了 Python)。/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&nbsp;-I/usr/local.......etc&nbsp;etc.使用标志我运行以下来生成我的目标文件。gcc&nbsp;-c&nbsp;ConnectFour.c&nbsp;-o&nbsp;ConnectFour.o&nbsp;-I/usr/local/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/include/python3.7m&nbsp;-I/...etc&nbsp;etc.步骤 2. 将目标文件转换为可执行文件为了生成可执行文件,我们需要运行以下命令。gcc&nbsp;main.o&nbsp;hello.o&nbsp;-o&nbsp;prog&nbsp;<our&nbsp;ldflags>为了生成 ldflags,这次我需要运行以下命令。我们再次使用配置实用程序,但这次使用--ldflags。/usr/local/Cellar/python3/3.7.0/Frameworks/Python.framework/Versions/3.7/bin/python3.7-config&nbsp;--ldflags这为我生成了以下标志。-L/usr/local/opt/python/Frameworks/Python.framework/Versions/3.7/lib/python3.7/config-3.7m-darwin&nbsp;-lpython3.7m&nbsp;...etc.&nbsp;etc.使用这些标志,我运行以下命令来生成我的可执行文件。gcc&nbsp;ConnectFour.o&nbsp;-o&nbsp;ConnectFour&nbsp;-L/usr/local/opt/python/Frameworks/Python.framework/Versions/3.7/lib/python3.7/config-3.7m-darwin&nbsp;-lpython3.7m&nbsp;...etc.&nbsp;etc.完毕!一个可执行文件弹出,我像运行任何其他 C 可执行文件一样运行它。特别感谢@ead 为我指明了正确的方向。

慕雪6442864

尝试跑步gcc&nbsp;-I&nbsp;/usr/local/Cellar/python3/3.7.0/Frameworks/Python.framework/Versions/3.7/Headers&nbsp;-o&nbsp;ConnectFour&nbsp;ConnectFour.c&nbsp;-L/usr/local/Cellar/python3/3.7.0/Frameworks/Python.framework/Versions/3.7&nbsp;-lpython3.7-L 标志将该目录添加到搜索路径,然后使用 -l 进行链接(因为 -l 似乎不接受绝对路径),在 Linux 上,使用 -l 时至少省略了 lib 前缀和扩展名,我从来没有虽然使用了 MacOSX,但如果不起作用,请尝试不同的组合。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python