请问Cmake怎样调用dll库?

今天我在研究cmake如何使用动态链接库dll的时候遇到了如下问题:
我先编译了一个dll文件,文件源码如下:
#include "stdio.h"

__declspec(dllexport) void hello(){
    printf("hello");
}
文件名设为a.dll
然后我又创建了一个可执行程序,其中cmake文件配置如下:
cmake_minimum_required(VERSION 3.24)
project(t1 C)

set(CMAKE_C_STANDARD 23)

link_directories (${PROJECT_SOURCE_DIR}/dll)
add_executable(t1 main.c)

target_link_libraries(${PROJECT_NAME} a.dll)
源文件内容如下:
extern void hello();

int main(){
    hello();
    return 0;
}
编译的时候没有报错,但是运行的时候却出现了错误:

img


进程已结束,退出代码-1073741515 (0xC0000135)

请问这是什么问题,为什么使用a.dll的时候会出现错误?怎样才能使用a.dll中的函数?求解答

确保a.dll文件位于正确的路径
您使用了指令将dll文件的路径添加到链接目录中,但是您并没有指定dll文件的完整路径。在指令中,您应该指定dll文件的完整路径,例如:link_directories()target_link_libraries()

target_link_libraries(${PROJECT_NAME} ${PROJECT_SOURCE_DIR}/dll/a.dll)
请将替换为实际的dll文件路径。${PROJECT_SOURCE_DIR}/dll/a.dll

确保您的系统已安装dll文件所需的运行时库
您的a.dll文件可能需要一些运行时库才能正常工作,这些库可能没有安装在您的系统中。您可以尝试在命令行中运行以下命令来检查系统中是否缺少某些库:

dumpbin /dependents a.dll
如果输出中包含任何缺少的库,则需要将它们安装在系统中。具体的安装方式取决于您的操作系统和缺少的库。

确保编译a.dll时使用了正确的编译选项
您编译a.dll时应该使用选项,这将生成一个导出符号表,用于链接到可执行文件中。您可以在Visual Studio中将此选项设置为“生成DLL”属性中的“是”来实现,或者在命令行中使用以下命令:/DLL

cl /LD a.c
请将替换为您的dll源文件名。丶a.c丶

希望这些步骤可以帮助您解决问题。

导出函数加上 __stdcall 看看呢

根据您提供的信息,可能存在以下几个问题:

  1. 您在 CMakeLists.txt 中使用了错误的变量名。将 target_link_libraries(${PROJECT_NAME} a.dll) 中的 ${PROJECT_NAME} 改为 ${PROJECT_NAME} 即可。

  2. 未将 DLL 文件添加到系统 DLL 搜索路径中。可以尝试以下两种方式添加:

    • 将 DLL 文件复制到可执行文件相同的目录下。
    • 将 DLL 文件所在的目录添加到系统环境变量 PATH 中,或者通过以下代码将 DLL 所在目录添加到程序运行时的搜索路径中:
      SetDllDirectory(dll_directory_path);
      
  3. 缺少依赖库或运行时库。如果 DLL 文件依赖于其他库,则需要将这些库同时添加到可执行文件中,并在运行时确保这些库也能够被正确加载。

希望以上解答对您有所帮助,如有疑问请随时追问。

哥哥你的的问题可能是由于系统找不到动态链接库 a.dll 引起的。为了解决这个问题,您可以采取以下步骤:

1.在 CMakeLists.txt 中添加以下内容以指定要使用的 DLL 库所在的路径:

link_directories (${PROJECT_SOURCE_DIR}/dll)

2.在 target_link_libraries 命令中添加 DLL 的名称和后缀名:

target_link_libraries(${PROJECT_NAME} a.dll)
  1. 将 DLL 文件复制到可执行文件的路径下,或者将 DLL 文件路径添加到环境变量 PATH 中。

通过以上操作,应该就可以正常调用 DLL 了。请注意,在 Windows 系统中,需要将 DLL 文件与可执行文件放在同一个目录下,否则程序会找不到 DLL 文件并抛出类似 "找不到模块" 的错误。