用C语言编译动态链接库

用C语言编译动态链接库,c,dll,cmake,C,Dll,Cmake,我正在尝试使用C编译一个简单的DLL。整个测试库的代码如下所示: #include <stdio.h> __declspec(dllexport) void hello(void) { printf("Hello, World!\n"); } DLL是建立的,所以我尝试用测试它,得到了错误:动态链接错误:Win32错误126。从节点ffi后退一步,我将新创建的DLL放入显然一致推荐的DLL调试工具中:。我构建的DLL似乎有错误。具体而言: Error: At least

我正在尝试使用C编译一个简单的DLL。整个测试库的代码如下所示:

#include <stdio.h>

__declspec(dllexport) void hello(void) {
    printf("Hello, World!\n");
}
DLL是建立的,所以我尝试用测试它,得到了
错误:动态链接错误:Win32错误126
。从节点ffi后退一步,我将新创建的DLL放入显然一致推荐的DLL调试工具中:。我构建的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的两个右窗格的底部,而在最上面的窗格中没有显示任何内容。Dependency Walker底部窗格中用于符号探索的唯一项目如下所示:

E    | Ordinal    | Hint       | Function | Entry Point
-----+------------+------------+----------+------------
[C ] | 1 (0x0001) | 0 (0x0000) | hello    | 0x000010C8
其中
[C]
为灰色(如果这对任何人都有意义的话)


我不确定我遗漏了什么导致此DLL具有错误的导出依赖项/符号。

事实证明,我是为错误的体系结构构建的。我以前的尝试(我的机器使用英特尔处理器)都是为x86构建的。在所有这些尝试都失败之后,我尝试在Python中使用这个DLL。通过
CDLL('lib_test.DLL')
加载DLL后提供的错误类型要复杂得多,不仅解释了不匹配的体系结构,而且还解释了我的机器所期望的体系结构。在我的例子中,它是
x86-amd64


现在我的DLL找不到这些库就有意义了。DLL试图获取未安装的MSVC++运行库,因为它们用于完全不同的体系结构。

IIRC您经常会看到这些错误,因为Windows在访问过程中删除了一个-a版本的API,这本身不一定是问题。对于Microsoft提供的DLL,您也会看到同样的情况。除非存在任何其他导入问题,例如,您的DLL依赖于运行时的调试版本,而该版本由于某种原因不可用于dependency walker或Node?我不确定这是否有任何帮助,但我在CLion中的Release下编译了我的DLL,希望重新满足一些无关的DLL导入要求。根据Dependency Walker的说法,它找不到的两个DLL是
API-MS-WIN-CRT-STDIO-L1-1-0.DLL
API-MS-WIN-CRT-RUNTIME-L1-1-0.DLL
。这两个库似乎都是基于MSVC++的可再发行库。但是,对于这两个“丢失的”可再发行文件,我都有x86和x86-64位版本。
E    | Ordinal    | Hint       | Function | Entry Point
-----+------------+------------+----------+------------
[C ] | 1 (0x0001) | 0 (0x0000) | hello    | 0x000010C8