包含 Python.h,但未建立 Py_initialze() 链接

Python.h included but Py_initialze() link not established

提问人:theNinthElement 提问时间:2/27/2022 最后编辑:theNinthElement 更新时间:3/2/2022 访问量:333

问:

我面临着Py_initialize的链接错误,尽管我在我的 CMake 中引用了我的 Python 库。找到 Python.h,但未建立链接。

inpainting.cpp:(.text+0x47843): undefined reference to `Py_Initialize'
/usr/bin/ld: inpainting.cpp:(.text+0x47854): undefined reference to 
`PyRun_SimpleStringFlags'
/usr/bin/ld: inpainting.cpp:(.text+0x47940): undefined reference to `Py_Finalize'
collect2: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/imgCodecs.dir/build.make:552: imgCodecs] Error 1
make[1]: *** [CMakeFiles/Makefile2:84: CMakeFiles/imgCodecs.dir/all] Error 2
make: *** [Makefile:91: all] Error 2

这是我的 CMakeList。https://pastebin.com/QkihgBGm

编辑:添加我尝试编译的方式。我在我的 makefile 上做 Cmake 和 make。

这是我尝试编译的 C++ 代码。

// *********** Begin: Run Python script ************************************************************
// Initialize the Python Interpreter
Py_Initialize();
PyRun_SimpleString("import sys");
char buff[FILENAME_MAX]; //create string buffer to hold path
getcwd( buff, FILENAME_MAX);
string current_working_dir(buff);
string shore_working_dir = current_working_dir + 
"/shore_imputation/";
const char * shore_working_dir_c = shore_working_dir.c_str();
qDebug() << shore_working_dir_c;
// Finish the Python Interpreter
Py_Finalize();
// *********** End: Run Python script 
**************************************************************
C++ Qt cmake makefile 链接器错误

评论

0赞 Scheff's Cat 2/27/2022
这回答了你的问题吗?什么是未定义的引用/未解析的外部符号错误,如何解决?
0赞 Scheff's Cat 2/27/2022
是否使用了正确的引用与未定义的引用无关。它确保您的代码(正在使用 )正确编译。“未定义引用”则表明您没有链接到(正确的)Python 。请编辑并公开您如何编译和链接 C++ 代码。#includePyInitialize()
0赞 Scheff's Cat 2/27/2022
仅供参考:Python 文档:类 Unix 系统下的编译和链接
0赞 theNinthElement 2/28/2022
我不确定这是否真的能回答并帮助我确定我在哪里挣扎。
0赞 Scheff's Cat 2/28/2022
您是否在 CMake 脚本中的某处添加了 Python 依赖项?你补充了什么?CMake 为 Python 提供了一个查找脚本:FindPython。我只是看了一下我们如何在 S/W 中添加 Python 依赖项。只是在回复中。但是,我会对此持保留态度,因为我们的脚本中有很多手工编织的东西,而且我们不使用 Python 的“常规”安装,而是将相关二进制文件复制到自己的目录中(出于部署和其他原因)。PYTHONtarget_link_libraries()

答:

0赞 theNinthElement 3/2/2022 #1

经过数小时的调查,Cmake 似乎区分大小写,需要显式调用才能链接到库。

target_link_libraries(SOURCE ${OpenCV_LIBS})
target_link_libraries(SOURCE ${PYTHON_LIBRARIES})

这使它起作用和宾果游戏......干杯!