使用C编译DLL

时间:2018-09-28 16:21:29

标签: c dll cmake

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

#include <stdio.h>

__declspec(dllexport) void hello(void) {
    printf("Hello, World!\n");
}

该库仅是概念的简单证明,它是由CLion使用以下CMakeLists.txt使用CMake构建的:

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对其进行测试并获得Error: Dynamic Linking Error: Win32 error 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的两个右窗格的底部,而最顶部的窗格中没有任何内容。 Dependency Walker底部窗格中用于符号浏览的唯一项看起来像:

E    | Ordinal    | Hint       | Function | Entry Point
-----+------------+------------+----------+------------
[C ] | 1 (0x0001) | 0 (0x0000) | hello    | 0x000010C8

[C ]是浅灰色(如果对任何人都有意义)。

我不确定导致该DLL导出的依赖项/符号错误的原因。

1 个答案:

答案 0 :(得分:1)

事实证明,我在为错误的体系结构进行构建。我之前尝试过为x86进行构建(我的机器使用Intel处理器)。在所有这些尝试均失败之后,我尝试使用ctypes在Python中使用此DLL。通过CDLL('lib_test.dll')加载DLL后提供的错误ctypes更加详尽,不仅解释了不匹配的体系结构,而且还解释了我的机器期望的体系结构。就我而言,是x86-amd64

现在使我的DLL无法找到那些库。 DLL试图获取未安装的MSVC ++运行时库,因为它们用于完全不同的体系结构。