使用C编译DLL

标签 c dll cmake

我正在尝试严格使用 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/

相关文章:

c++ - 在tsan_libdispatch_mac.cc期间,使用cmake进行的LLVM构建失败。 “Error: conflicting types for …”

c++ - 如何在 cmake 中使用 FFTW 库?

c - 在古怪的数据结构中释放后将指针设置为 NULL (C)

对 C 中的 putchar 结果感到困惑

c++ - 如何检测全局与链路本地 IPv6 地址

c++ - 在 linux 中使用为 windows 编写的软件库(使用 dll)

.net - 在 C# dll 中缓存数据的最佳方法是什么?

c - 取消引用指向不完整类型的指针

c# - 使用不同文件夹中的 DLL 运行 mono .exe

c++ - Visual Studio下CMake构建问题