pythonXY.lib
在Windows上,针对的链接有点偷偷摸摸。当您查看用于链接的命令行时,您会看到没有python库传递给链接器,即’link.exe’。注意:对于Linux也是如此,但是在Linux上则不必这样做,因为所需的符号将由python- executable提供。
但是,很容易通过来检查是否 dumpbin /dependents resulting.pyd
存在依赖关系pythonXY.dll
,并且还extra_link_args = ["/VERBOSE:LIB"]
对扩展定义进行了添加,并且触发链接器的详细模式将显示该链接器使用pythonXY.lib
。
偷偷摸摸的部分:Microsoft Compler具有便利的编译指示,#pragma comment(lib, ...)
可以自动触发库的链接,该链接也用在Python标头中:
# if defined(_MSC_VER)
/* So MSVC users need not specify the .lib
file in their Makefile (other compilers are
generally taken care of by distutils.) */
# if defined(_DEBUG)
# pragma comment(lib,"python39_d.lib")
# elif defined(Py_LIMITED_API)
# pragma comment(lib,"python3.lib")
# else
# pragma comment(lib,"python39.lib")
# endif /* _DEBUG */
# endif /* _MSC_VER */
如您所见,要链接到调试版本,需要定义_DEBUG
。
_DEBUG
由distutils
Windows自动定义,如果build_ext
通过options调用--debug
,例如
python setup.py build_ext -i --debug
可以翻译pip
成
pip install --global-option build --global-option --debug XXXXX
它可以大致解释为:触发build
命令(还包括build_ext
-command),--debug
在安装前带有选项。
构建调试C扩展时的另一种功能,在Windows上还有更多功能:
#ifdef _DEBUG
# define Py_DEBUG
#endif
在Python3.8之前定义 Py_DEBUG
宏意味着无与伦比的ABI ,因为它还假设这会导致发布模式的不同内存布局以及某些其他功能缺失。Py_TRACE_REFS
PyObject
但是,从python3.8开始,通过提供缺少的pythonXY_d.lib
/pythonyX.lib
作为链接到另一个版本的符号链接,可能可以摆脱它。