对Py_Initialize()的未定义引用
Undefined reference to Py_Initialize()
我试图将一些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
相关文章:
- 对C宏的未定义引用,但在定义它时会出现重新定义错误
- 编译时的 CImg 库返回对"__imp_SetDIBitsToDevice"的未定义引用
- 对Py_Initialize()的未定义引用
- 使用mysql c++连接器的未定义引用
- 对 Scalar ::Scalar() 的未定义引用
- 对复制 CTOR 和 CTOR 的未定义引用
- 对显式实例化的模板函数的未定义引用
- TensorRT (C++ API) 对"createNvOnnxParser_INTERNAL"的未定义引用
- 2个模板化类的非模板友元函数未定义引用错误
- 编译 libfluid 样本控制器时对"event_base_del_virtual"的未定义引用
- 获取对function_name的未定义引用
- 对 'std::thread::_M_start_thread CMake 的未定义引用进行基准测试
- 对结构方法的未定义引用
- 使用内联函数 c++ 的未定义引用
- 对 CMake 中'cudaRegisterLinkedBinary'链接错误的未定义引用?
- 对 DLOPEN 的未定义引用
- QT C++中对全局变量的未定义引用
- 快速数学导致对"__pow_finite"的未定义引用
- 对 boost::system::d etail::system_category_instance 的未定义引用,从
- OpenCV 3.4.3 中对 'cv::String::d eallocate()' 错误的未定义引用