我正在尝试严格使用 C 编译一个简单的 DLL。整个测试库的代码如下所示:
#include <stdio.h>
__declspec(dllexport) void hello(void) {
printf("Hello, World!\n");
}
该库旨在作为一个简单的概念证明,它是使用 CLion 提供的 CMake 和以下 CMakeLists.txt 构建的:
cmake_minimum_required(VERSION 3.12)
project(test_lib C)
set(CMAKE_C_STANDARD 99)
add_library(test_lib SHARED library.c)
DLL 已构建,因此我尝试使用 node-ffi 对其进行测试。并得到错误:动态链接错误:Win32错误126
。从node-ffi退后一步,我将新创建的DLL放入显然一致推荐的DLL调试工具中:Dependency Walker 。我构建的 DLL 似乎有错误。具体来说:
Error: At least one required implicit or forwarded dependency was not found.
Warning: At least one delay-load dependency module was not found.
但是 Dependency Walker 确实发现我正在导出符号 hello
。我这样做的依据是,当我在 Dependency Walker 中检查根 DLL 时,hello
已列出并带有入口点。它显示在 Dependency Walker 的两个右 Pane 的底部,而最顶部的 Pane 中没有任何内容。 Dependency Walker 底部 Pane 中用于符号探索的唯一项目如下所示:
E | Ordinal | Hint | Function | Entry Point
-----+------------+------------+----------+------------
[C ] | 1 (0x0001) | 0 (0x0000) | hello | 0x000010C8
其中 [C ]
是浅灰色(如果这对任何人都意味着什么)。
我不确定我缺少什么导致此 DLL 具有错误的导出依赖项/符号。
最佳答案
事实证明,我正在构建错误的架构。我之前尝试过为 x86 构建(我的机器使用 Intel 处理器)。在所有这些尝试都失败之后,我尝试在 Python 中使用此 DLL ctypes 。通过 CDLL('lib_test.dll')
加载 DLL 后提供的错误 ctypes 更加详细,不仅解释了不匹配的体系结构,还解释了我的机器所期望的体系结构。就我而言,它是 x86-amd64
。
现在我的 DLL 找不到这些库了。 DLL 试图获取未安装的 MSVC++ 运行时库,因为它们适用于完全不同的体系结构。
关于使用C编译DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52559298/