新建一个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,然后点击进行运行。

1123

被折叠的 条评论
为什么被折叠?



