Windows下Cython封装embree时__declspec(dllimport)使用与链接问题
问题解答
关于__declspec(dllimport)在Cython中的使用
你不需要在.pxd文件中手动添加__declspec(dllimport)相关声明,Cython官方说明的「省略平台相关扩展」要求是正确的:Cython生成C++代码时会自动引入你指定的rtcore.h头文件,头文件中定义的RTCORE_API宏会自动给所有导出函数加上对应的__declspec(dllimport)修饰,无需在.pxd中重复声明。
第一阶段LNK2001链接错误解决
你之前的配置错误点在于:ext.libraries参数仅接受不带后缀的库名,不能填写路径,库文件的搜索路径需要通过ext.library_dirs参数指定。
第二阶段编译成功但导入错误解决
编译通过仅说明链接器找到了对应的.lib导入库,运行导入时找不到模块是因为Windows系统无法定位Embree及依赖的TBB库的.dll动态库文件,和子包配置无关。
完整修改步骤
1. 修正setup.py配置
将setup.py中遍历ext_modules的部分修改为以下标准写法:
for ext in ext_modules: # 新增Embree头文件搜索路径 ext.include_dirs = include_path + ["pyembree/embree2"] # 指定.lib文件所在的搜索路径 ext.library_dirs = ["pyembree/embree2"] # 仅填写依赖的库名,不要加路径、后缀 ext.libraries = ["embree", "tbb", "tbbmalloc"]
2. 处理运行时DLL依赖
选择以下任意一种方式解决DLL找不到的问题:
- 把Embree安装目录
C:/Program Files/Intel/Embree v2.17.7 x64/bin/下的所有.dll文件(包括embree.dll、tbb.dll、tbbmalloc.dll等)复制到项目内的pyembree/目录下,和生成的.pyd文件放在同一文件夹 - 把
C:/Program Files/Intel/Embree v2.17.7 x64/bin/路径添加到系统环境变量PATH中,重启终端后再执行导入操作
3. 重新编译
执行以下命令重新构建:
py setup.py clean py setup.py build_ext -i
内容的提问来源于stack exchange,提问作者adam.hendry
相关产品推荐
相关产品推荐

