使用CMake构建动态库及调用

新建一个cmake项目

1、创建新项目

然后对自动生成的一些文件做相应的调整,按照自己的喜好和习惯去建相应的文件

动态库dll的构建

在Windows平台上,动态库(DLL)的导出和导入需要通过 __declspec(dllexport) 和 __declspec(dllimport) 来显式声明。通常,我们会使用一个宏来切换这两种声明。如下:

// add.h
#pragma once

#ifdef MATHLIBEXPORT_EXPORTS
#define MATHLIBEXPORT_API __declspec(dllexport)
#else
#define MATHLIBEXPORT_API __declspec(dllimport)
#endif

extern "C" MATHLIBEXPORT_API int add(int a, int b);

  • 当 MATHLIBEXPORT_EXPORTS 被定义时,MATHLIBEXPORT_API 会被替换为 __declspec(dllexport),表示当前正在编译动态库,需要导出符号。在编译dll的时候CMakeLists.txt中会定义。
  • 当 MATHLIBEXPORT_EXPORTS 未被定义时,MATHLIBEXPORT_API 会被替换为 __declspec(dllimport),表示当前正在使用动态库,需要导入符号。在执行调用dll的时候CMakeLists.txt中不会定义。
  • extern "C":告诉编译器按照C语言的方式处理函数名,即不进行名称修饰。

add.cpp 源文件函数定义

// add.cpp
#include "add.h"

extern "C" MATHLIBEXPORT_API int add(int a, int b) {
    return a + b;
}

CMakeLists.txt

cmake_minimum_required(VERSION 3.10)
project("dllgen")

# 设置C++标准
set(CMAKE_CXX_STANDARD 11)

# 添加动态库
add_library(adddll SHARED src/add.cpp)

# 指定动态库的导出宏 编译动态库的时候定义宏MATHLIBEXPORT_EXPORT
target_compile_definitions(adddll PRIVATE MATHLIBEXPORT_EXPORTS)

# 设置输出路径
set_target_properties(adddll PROPERTIES
    ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/dllout
    RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/dllout
)
  • add_library()中 adddll 是生成的.lib名称;SHARED 指定的是生成库类型为动态库
  • set_target_properties 设置生成的库存放路径为dllout文件夹下
  • target_compile_definitions() 编译动态库是一定要定义宏,告知此时需要导出库

然后点击生成-》全部重新生成,结束后可以在dllout里查看到生成的dll文件。

动态库调用

如何调用呢?调用时,将dll放置到include路径下,链接的是.lib 导入库,.dll 的文件夹路径一定要添加到环境变量中,或者放在.exe目录下,对应的main.cpp内容自行编写,对应的调用库的CMakeLists.txt如下:

cmake_minimum_required(VERSION 3.10)
project("dlladd")

# 设置C++标准
set(CMAKE_CXX_STANDARD 11)

# 添加动态库
#add_library(adddll SHARED src/add.cpp "include/add.h")

# 添加可执行文件
add_executable(testdll dlluse/main.cpp)

# 链接动态库的导入库到可执行文件,并非直接链接动态库
target_link_libraries(testdll PRIVATE ${PROJECT_SOURCE_DIR}/dllout/adddll.lib)
## 指定头文件目录
target_include_directories(testdll PRIVATE ${PROJECT_SOURCE_DIR}/include)

运行

生成-》重新生成,编译成功后,图上2下拉框选择对应的.exe,然后点击进行运行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序小K

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值