如何为 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 的静态链接与动态链接