使用 Python.h 未定义符号进行 C++ 编译

Posted

技术标签:

【中文标题】使用 Python.h 未定义符号进行 C++ 编译【英文标题】:C++ Compiling with Python.h Undefined Symbols 【发布时间】:2012-10-29 04:48:39 【问题描述】:

所以,我一直在尝试将 Python.h 用于我想要从事的一个看起来很 /simple/ 的小项目。但在开始之前,我想尝试学习如何使用 Python.h。 所以我在网上找到了这个小例子。

#include "Python/Python.h"  

int main(int argc, char** argv)  
  
    Py_Initialize();  
    PyRun_SimpleString("print 'Test'");  
    PyRun_SimpleString("print str(3 + 5)"); 
    Py_Exit(0);  

看起来很简单。当我第一次使用时

gcc test.cpp

要编译,我得到了一些未定义的符号。我很快发现我应该使用

-lpython2.7

然后我发现我也可以使用

-L/Library/Frameworks/Python.framework/Versions/2.7/lib/

这不起作用(我确保 /Library/Frameworks/Python/Versions/2.7/lib/ 存在) 我被困住了,我该怎么办? 我明白了

Undefined symbols:
  "_Py_Initialize", referenced from:
      _main in ccoUOSlc.o
  "_PyRun_SimpleStringFlags", referenced from:
      _main in ccoUOSlc.o
      _main in ccoUOSlc.o
  "___gxx_personality_v0", referenced from:
      _main in ccoUOSlc.o
      CIE in ccoUOSlc.o
  "_Py_Exit", referenced from:
      _main in ccoUOSlc.o
ld: symbol(s) not found
collect2: ld returned 1 exit status

编辑: 我刚刚尝试使用 -Framework 参数,并尝试在 -L 之后添加 -l python2.7 参数,现在我得到了

Undefined symbols:
  "___gxx_personality_v0", referenced from:
      _main in ccfvtJ4j.o
      CIE in ccfvtJ4j.o
ld: symbol(s) not found
collect2: ld returned 1 exit status

现在呢?

【问题讨论】:

这应该可以工作(刚刚在 Linux 上测试,使用 GCC 和 Python 2.7)。您能否确认libpython2.7.so 存在于您使用-L 选项指定的目录中? 嗯。实际上没有 libpython2.7.所以那里有 libpython2.7.dylib(如果有帮助,在 Mac OSX 10.6.8 上) 对。我曾假设 Linux,但在 MacOS 上应该没问题。不确定是什么导致了问题。 请注意,-L 仅更新库搜索路径:它实际上并没有链接到任何东西。您是否使用-L 选项来代替-l 选项? 【参考方案1】:

如果您在 OS X 上使用 Python 框架安装,看起来您是基于路径的,您可以使用 Apple 编译器驱动程序的 -framework 参数:

cc test.cpp -framework Python

或者,您可以显式指定目录路径和库名称:

cc test.cpp -L /Library/Frameworks/Python.framework/Versions/2.7/lib/ -l python2.7

更新:使用您在 cmets 中报告的配置(Xcode 3.2.6gcc-4.2),您似乎需要显式调用gccc++ 变体。要么:

g++ test.cpp -framework Python

c++ test.cpp -framework Python

应该可以。

【讨论】:

任何人 :(?我试图提供尽可能多的信息。还有什么我可以尝试的吗? 您使用的是什么编译器 (cc --version)(来自 Xcode 的哪个版本:xcodebuild -version)以及您使用的 OS X 版本是什么? cc: i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5666) (dot 3) Xcode: Xcode 3.2.6 组件版本: DevToolsCore-1809.0 ; DevToolsSupport-1806.0 BuildVersion: 10M2518 我在 iMac 2009 年初“24 台计算机上使用 Mac OSX 10.6.8,配备 4GB RAM 和 2.66GHz Intel Core Duo 2 处理器。

以上是关于使用 Python.h 未定义符号进行 C++ 编译的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中使用 boost:regex_error 时未定义符号?

使用 bjam 编译的来自 C++ 的未定义符号

VC DLL 中 C++ 符号的 MinGw 未定义符号

未定义符号,使用指针 C++ 访问成员函数

Python ImportError - 未定义符号 - 用于自定义 C++ 模块

使用文件夹结构时的 C++ 未定义符号