【问题标题】:Python C API Undefined symbols for architecture x86_64用于架构 x86_64 的 Python C API 未定义符号
【发布时间】:2021-12-31 20:44:04
【问题描述】:

我正在尝试编译一个使用 Python 的 C API 的文件。我在 conda 环境中工作,在 macOS Monterey 上运行。我正在使用 GCC 编译如下:

gcc -c -fPIC file.c -I "${CONDA_PREFIX}/include/python3.9/" -o file.o
gcc file.o -o a.out

问题不在于包含 <Python.h> 标头,这是正确完成的,似乎一旦包含 Python 库,其函数的符号是​​未定义的:

Undefined symbols for architecture x86_64:
  "_PyCallable_Check", referenced from:
      _main in file.o
  "_PyImport_ImportModule", referenced from:
      _main in file.o
  "_PyObject_CallObject", referenced from:
      _main in file.o
  "_PyObject_GetAttrString", referenced from:
      _main in file.o
...

我确定问题不在于代码,因为我正在运行 Python 官方网站上的一些演示代码。尝试使用 Python C API 开发 Python 模块,编译为共享库时,也会出现同样的错误。

我也试过用distutils/setuptools编译整个东西,误差是千米,但实质和上面的一样。

上述异常是使用this demo code获得的。

ls ${CONDA_PREFIX}/lib ${CONDA_PREFIX}/lib/python3.9 的输出

/opt/anaconda3/envs/generic/lib:
Tk.icns                 libncurses.6.dylib
Tk.tiff                 libncurses.dylib
clang                   libncursesw.6.dylib
dtrace                  libncursesw.dylib
engines-3               libnode.102.dylib
icu                 libomp.dylib
itcl4.2.1               libpanel.6.dylib
libbz2.1.0.8.dylib          libpanel.dylib
libbz2.a                libpanelw.6.dylib
libbz2.dylib                libpanelw.dylib
libc++.1.0.dylib            libpython3.9.a
libc++.1.dylib              libpython3.9.dylib
libc++.a                libpython3.9.nolto.a
libc++.dylib                libquadmath.0.dylib
libc++experimental.a            libquadmath.dylib
libcrypto.3.dylib           libreadline.8.1.dylib
libcrypto.dylib             libreadline.8.dylib
libffi.8.dylib              libreadline.dylib
libffi.a                librustc-stable_rt.asan.dylib
libffi.dylib                librustc-stable_rt.lsan.dylib
libform.6.dylib             librustc-stable_rt.tsan.dylib
libform.dylib               librustc_driver-5d5e1e2505841b99.dylib
libformw.6.dylib            libsqlite3.0.dylib
libformw.dylib              libsqlite3.dylib
libgcc_s.1.dylib            libssl.3.dylib
libgcc_s_ppc64.1.dylib          libssl.dylib
libgcc_s_x86_64.1.dylib         libstd-dd8a82589e0cba34.dylib
libgfortran.5.dylib         libtcl8.6.dylib
libgfortran.dylib           libtclstub8.6.a
libgomp.1.dylib             libtest-a18e5b5e2a65c941.dylib
libgomp.dylib               libtinfo.6.dylib
libhistory.8.1.dylib            libtinfo.dylib
libhistory.8.dylib          libtinfow.6.dylib
libhistory.dylib            libtinfow.dylib
libicudata.69.1.dylib           libtk8.6.dylib
libicudata.69.dylib         libtkstub8.6.a
libicudata.dylib            libuv.1.dylib
libicui18n.69.1.dylib           libuv.a
libicui18n.69.dylib         libuv.dylib
libicui18n.dylib            libz.1.2.11.dylib
libicuio.69.1.dylib         libz.1.dylib
libicuio.69.dylib           libz.a
libicuio.dylib              libz.dylib
libicutest.69.1.dylib           node_modules
libicutest.69.dylib         ossl-modules
libicutest.dylib            pkgconfig
libicutu.69.1.dylib         python3.9
libicutu.69.dylib           rustlib
libicutu.dylib              sqlite3.34.0
libicuuc.69.1.dylib         tcl8
libicuuc.69.dylib           tcl8.6
libicuuc.dylib              tclConfig.sh
libiomp5.dylib              tclooConfig.sh
liblzma.5.dylib             tdbc1.1.2
liblzma.dylib               tdbcmysql1.1.2
libmenu.6.dylib             tdbcodbc1.1.2
libmenu.dylib               tdbcpostgres1.1.2
libmenuw.6.dylib            terminfo
libmenuw.dylib              thread2.8.6
libncurses++.a              tk8.6
libncurses++w.a             tkConfig.sh

/opt/anaconda3/envs/generic/lib/python3.9:
LICENSE.txt                 mailbox.py
__future__.py                   mailcap.py
__phello__.foo.py               mimetypes.py
__pycache__                 modulefinder.py
_aix_support.py                 multiprocessing
_bootlocale.py                  netrc.py
_bootsubprocess.py              nntplib.py
_collections_abc.py             ntpath.py
_compat_pickle.py               nturl2path.py
_compression.py                 numbers.py
_markupbase.py                  opcode.py
_osx_support.py                 operator.py
_py_abc.py                  optparse.py
_pydecimal.py                   os.py
_pyio.py                    pathlib.py
_sitebuiltins.py                pdb.py
_strptime.py                    pickle.py
_sysconfigdata__darwin_darwin.py        pickletools.py
_sysconfigdata__darwin_darwin.py.orig       pipes.py
_sysconfigdata_x86_64_apple_darwin13_4_0.py pkgutil.py
_threading_local.py             platform.py
_weakrefset.py                  plistlib.py
abc.py                      poplib.py
aifc.py                     posixpath.py
antigravity.py                  pprint.py
argparse.py                 profile.py
ast.py                      pstats.py
asynchat.py                 pty.py
asyncio                     py_compile.py
asyncore.py                 pyclbr.py
base64.py                   pydoc.py
bdb.py                      pydoc_data
binhex.py                   queue.py
bisect.py                   quopri.py
bz2.py                      random.py
cProfile.py                 re.py
calendar.py                 reprlib.py
cgi.py                      rlcompleter.py
cgitb.py                    runpy.py
chunk.py                    sched.py
cmd.py                      secrets.py
code.py                     selectors.py
codecs.py                   shelve.py
codeop.py                   shlex.py
collections                 shutil.py
colorsys.py                 signal.py
compileall.py                   site-packages
concurrent                  site.py
config-3.9-darwin               smtpd.py
configparser.py                 smtplib.py
contextlib.py                   sndhdr.py
contextvars.py                  socket.py
copy.py                     socketserver.py
copyreg.py                  sqlite3
crypt.py                    sre_compile.py
csv.py                      sre_constants.py
ctypes                      sre_parse.py
curses                      ssl.py
dataclasses.py                  stat.py
datetime.py                 statistics.py
dbm                     string.py
decimal.py                  stringprep.py
difflib.py                  struct.py
dis.py                      subprocess.py
distutils                   sunau.py
doctest.py                  symbol.py
email                       symtable.py
encodings                   sysconfig.py
ensurepip                   tabnanny.py
enum.py                     tarfile.py
filecmp.py                  telnetlib.py
fileinput.py                    tempfile.py
fnmatch.py                  test
formatter.py                    textwrap.py
fractions.py                    this.py
ftplib.py                   threading.py
functools.py                    timeit.py
genericpath.py                  tkinter
getopt.py                   token.py
getpass.py                  tokenize.py
gettext.py                  trace.py
glob.py                     traceback.py
graphlib.py                 tracemalloc.py
gzip.py                     tty.py
hashlib.py                  turtle.py
heapq.py                    turtledemo
hmac.py                     types.py
html                        typing.py
http                        unittest
idlelib                     urllib
imaplib.py                  uu.py
imghdr.py                   uuid.py
imp.py                      venv
importlib                   warnings.py
inspect.py                  wave.py
io.py                       weakref.py
ipaddress.py                    webbrowser.py
json                        wsgiref
keyword.py                  xdrlib.py
lib-dynload                 xml
lib2to3                     xmlrpc
linecache.py                    zipapp.py
locale.py                   zipfile.py
logging                     zipimport.py
lzma.py                     zoneinfo

我的CONDA_PREFIX/opt/anaconda3/envs/generic

【问题讨论】:

  • 命令ls ${CONDA_PREFIX}/lib ${CONDA_PREFIX}/lib/python3.9的输出是什么?我想查看您可用的库的实际名称。另外,echo $CONDA_PREFIX 的输出是什么?
  • @DavidGrayson 嗨,我已经编辑了我的帖子。谢谢。

标签: python c


【解决方案1】:

尝试将此添加到您的链接命令中:

-L${CONDA_PREFIX}/lib -lpython3.9

这应该告诉链接器使用我在您的目录列表中看到的 libpython3.9.a 文件。

顺便说一句,我认为 Conda 附带了一些输出这些相同选项的配置工具,因此您不必对 Python 版本号进行硬编码。

【讨论】:

  • 天哪,它编译了!在过去的两天里,我一直在想它:)
  • 现在您可以记住这个通用模式,并在任何 C 或 C++ 程序中出现未定义符号错误时再次使用它!
【解决方案2】:

此命令:gcc file.o -o a.out 没有链接到 python 库。

您需要向其添加(附加)-lpython3 和可能的 -L${CONDA_PREFIX}/lib/python3.9

【讨论】:

  • 嗨,我收到了ld: library not found for -lpython3 。所以我发现,既然整个事情都是一个 conda 环境,它应该只是-lpython。但是我得到ld: cannot link directly with dylib/framework, your binary is not an allowed client of /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/lib/libpython.tbd for architecture x86_64
猜你喜欢
  • 2016-06-20
  • 1970-01-01
  • 2015-06-15
  • 1970-01-01
  • 2014-09-16
  • 1970-01-01
  • 2015-03-09
  • 2014-08-07
  • 2012-07-20
相关资源
最近更新 更多