如何为 C 扩展链接 python 的静态库?

Posted

技术标签:

【中文标题】如何为 C 扩展链接 python 的静态库?【英文标题】:How to link python's static library for C extensions? 【发布时间】:2015-02-21 06:18:54 【问题描述】:

我正在尝试为 python 编写一个涉及 Python C API 的 C++ 扩展。根据我之前使用 Visual Studio 做这件事的经验,我只需要包含 python 的头文件并链接 python 的静态库就可以了。

但是我现在无法在 OS X Mavericks 上执行此操作。我从 python.org 安装了一个单独的 Python 3.4.2,并在我的 Cmake 配置中添加了一个包含条目:include_directories("/Library/Frameworks/Python.framework/Versions/3.4/Headers") 然后我不知道如何处理静态库部分。在 Windows 上,它们存储在 %python_root%/libs 中,您可以在那里找到 .lib 文件。但在 OS X 上,我找不到放置 .a 静态库的目录。

我尝试了几种解决方案,例如将python-config --lib 的结果附加到编译选项和set(CMAKE_BUILD_TYPE Release),但最终都出现以下错误:

Undefined symbols for architecture x86_64:
    "_PyLong_FromLong", referenced from:
        test() in Main.cpp.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

我也试过distutils,但它似乎也不能正常工作:(

【问题讨论】:

你在哪里设置python-config --libs返回的标志/库?到哪个变量?因为这些标志是 linker 标志而不是编译器标志。 我在cmake.txt 中将它们设置为CMAKE_CXX_FLAGS,返回的结果类似于-ldl -framework CoreFoundation -lpython3.4m 将库添加到编译器标志没有帮助,因为它们仅用于编译,您应该将它们添加到例如CMAKE_EXE_LINKER_FLAGS 代替。然后它们也将被添加到链接器命令行的正确位置(对象/源文件和库的顺序很重要)。 谢谢。我添加了CMAKE_SHARED_LINKER_FLAGS 条目以及指向静态库路径的LINK_DIRECTORIES,它现在可以工作了:) 【参考方案1】:

您收到链接器错误,该库尚未添加到您的链接选项中。

在我的系统 OSX 10.8.5 上,静态库位于以下目录中: 您需要将该目录添加到您的 cmake 库路径中,并添加 python 库本身。 (在 GCC 中,您使用 -L 和 -l 选项)。

Directory: /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/config/

file: libpython2.7.a 

【讨论】:

谢谢,它现在可以工作了 :) 我认为静态库目录将包含许多 .a 文件,就像它在 Windows 上所做的那样,但这里的情况完全不同。

以上是关于如何为 C 扩展链接 python 的静态库?的主要内容,如果未能解决你的问题,请参考以下文章

Shell 扩展:C/C++ 运行时 DLL 的静态链接与动态链接

如何为linux静态库隐藏本地符号

使用 Numpy 将 Python 库静态链接到 C (C++)

linux C/C++编程之库-动态库,静态库创建及使用

如何使用cmake生成基于静态库的动态链接库

如何为不同的 OS/Python 版本编译 Python C/C++ 扩展?