Python 如何将库与DLL链接(导入)
遵守以下规则:Python 如何将库与DLL链接(导入),python,windows,bazel,Python,Windows,Bazel,遵守以下规则: # in @org_python cc_library( name = "lib", srcs = [ "libs/python35.lib", ], ... # in // cc_binary( name = "bin", srcs = [ "mypybinding.cpp", ], deps = [ "@org_python//:lib", ], 链接
# in @org_python
cc_library(
name = "lib",
srcs = [
"libs/python35.lib",
],
...
# in //
cc_binary(
name = "bin",
srcs = [
"mypybinding.cpp",
],
deps = [
"@org_python//:lib",
],
链接会产生很多:
mypybinding.o : error LNK2001: unresolved external symbol PyType_Type
正确链接导入库需要哪些步骤
问题似乎部分在于
python35.lib中的这个条目:
Version : 0
Machine : 8664 (x64)
TimeDateStamp: 576F0350 Sun Jun 26 00:18:56 2016
SizeOfData : 00000019
DLL name : python35.dll
Symbol name : PyType_Type
Type : data
Name type : name
Hint : 794
Name : PyType_Type
我假设这意味着该符号仅在DLL中可用,而完全静态链接是不可能的
我尝试将DLL放入srcs
,但似乎这些DLL只直接传递给链接器。不要使用srcs
,而是使用linkopts
:
cc_library(
...
linkopts = ["-Wl,python35.lib"],
)
请参阅。我认为这不适用于以下三个原因:1python35.lib
不在系统中,而是源文件2python35.lib
只是一个导入库(对于示例libs不确定)和3。为了将-Wl,$(location libs/python35.lib)
添加到linkopts
中,我需要将该文件指定为一个依赖项,我不知道该依赖项是如何添加的。为这个问题添加了更多细节。0.4.4的解决方法(由提供):linkopts=[“-Lexternal/org\u python/libs/”,“-Wl,python35.lib”]
似乎不再适用于0.5.1。嗯,我认为您原来的规则应该适用。你的BAZEL_PYTHON指向哪里?因为,在中,我们将它的include
和libs
路径添加到include
和LIB
环境变量。它是否与libs/python35.lib所属的python相同?你能和我分享一下你的示例项目吗?这样我就可以重现错误了。所以我现在让BAZEL_PYTHON
指向与libs/python35.lib
相同的安装,但它仍然不起作用。我试图生成一个最小的测试用例。