以下代码有效,但是当我添加注释语句(new int)时,它失败了:
FileNotFoundError:找不到模块“libkv_module_shared.dll”(或其依赖项之一)。尝试使用带有构造函数语法的完整路径。
C++:
int a = 7;
extern "C" {
__declspec(dllexport) size_t setup() {
//new int; works unless commented in
return ++a;
}
}
Python
from flask import Flask, jsonify, request
import os
import ctypes
#DLL_REL_PATH = './cmake-build-debug/'
DLL = 'libkv_module_shared.dll'
DLL_FULL_PATH = "C:/Users/editn/CLionProjects/kv_module_shared/cmake-build-debug/"
os.add_dll_directory(DLL_FULL_PATH)
os.environ['PATH'] += DLL_FULL_PATH
clib = ctypes.WinDLL(DLL)
print("Using clib={:}".format(clib))
clib.setup.argtypes = ()
clib.setup.restype = ctypes.c_ssize_t
print(clib.setup())
注意:在窗口、Python 3.1、Win 11 上工作
我尝试了 ctypes.WinDLL 和 CDLL 的其他变体,其中的路径描述和 winmode 参数有所变化,其中大多数在加载时较早失败。
使用 CLion 2024.1,我构建共享库,然后从 CLion 执行 python。作为 Flask 服务器形式 PowerShell 执行时的行为相同(此代码中不存在,因为它被专门剥离到手头的问题)
附加信息:替换为
clib = ctypes.CDLL(DLL)
时
该程序仍然有效,但引入 new int;
它会以不同的方式失败(并且在加载指令之前)
FileNotFoundError:找不到模块“libkv_module_shared.dll”(或其依赖项之一)。尝试使用带有构造函数语法的完整路径。
使用 malloc() 代替 new() 是有效的。显然,问题取决于加载时是否发现某些第三层依赖项。
我将代码移植到 linux ubuntu 上,一切正常。也许对于后代来说,有人可以解释为什么这在 Windows 上不起作用