对Py_Initialize()的未定义引用

Undefined reference to Py_Initialize()

本文关键字:未定义 引用 Py Initialize      更新时间:2023-10-16

我试图将一些Python嵌入到C程序中,但首先我测试了一些基本操作,如以下代码所示:

#include <stdio.h>
#include <stdlib.h>
#include <random>
#include <chrono>
#include <iostream>
#include <math.h>
#include <Python.h>
int main()
{
Py_Initialize();
PyRun_SimpleString("print('Hello world')");
Py_Finalize();
// Some C code
}

事实证明,(a(当注释掉与Python相关的行(Py_Initialize、PyRun_SingleString、Py_Finalize(时,makefile确实很好地构建了程序,(b(然而,当添加Python行时,构建返回以下错误:

g++ -o program program.cpp -lm -std=c++11 -O3 -I/usr/include/python3.6m/
/tmp/ccgiujXn.o: In function `main':
program.cpp:(.text.startup+0x62): undefined reference to `Py_Initialize'
program.cpp:(.text.startup+0x70): undefined reference to `PyRun_SimpleStringFlags'
program.cpp:(.text.startup+0x75): undefined reference to `Py_Finalize'
collect2: error: ld returned 1 exit status
Makefile:2: recipe for target 'exec_program' failed
make: *** [exec_program] Error 1

你知道为什么会出现这个错误吗?我认为Python.h标头添加正确,但添加Python行时似乎并非如此。我的makefile是:

exec_program:  program.cpp
g++ -o program program.cpp -lm -std=c++11 -O3 -I/usr/include/python3.6m/
./program
rm program

我使用的是Ubuntu 18.04.4 LTS、g++7.4.0、Python 3.6.9(/usr/lib/(和3.7.6(/home/anaconda3/lib(。

很抱歉,如果你发现这个问题是重复的,但我认为没有其他帖子能解决我的问题。

提前感谢您的帮助!

您必须将库与-l链接

您不应该将模块编译为独立的可执行文件,而应该将其编译为共享库对象*.so,因此对象行Py_Initialize在运行时可用。文件方式建议采用

from distutils.core import setup, Extension
module1 = Extension('demo',
define_macros = [('MAJOR_VERSION', '1'),
('MINOR_VERSION', '0')],
include_dirs = ['/usr/local/include'],
libraries = ['tcl83'],
library_dirs = ['/usr/local/lib'],
sources = ['demo.c'])
setup (name = 'PackageName',
version = '1.0',
description = 'This is a demo package',
author = 'Martin v. Loewis',
author_email = 'martin@v.loewis.de',
url = 'https://docs.python.org/extending/building',
long_description = '''
This is really just a demo package.
''',
ext_modules = [module1])

distutils模块将为您生成正确的gcc命令。

您可以在官方文档中阅读更多关于构建python模块的信息https://docs.python.org/3/extending/building.html#building

添加/usr/lib/x86_64-linux-gnu/库目录和python3.6m库:

g++ -o program program.cpp -lm -std=c++11 -O3 -I/usr/include/python3.6m/ -L /usr/lib/x86_64-linux-gnu/ -lpython3.6m