IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> c++ 生成dll并引用 -> 正文阅读

[C++知识库]c++ 生成dll并引用

采坑三天,终于解决编译动态库以及动态库给其他工程引用问题,也很感谢同事的帮助,希望遇到该问题可以起到帮助
dll 动态库编译

// MyDll_Name.h
// dll头文件定义宏,编译时应该是dllexport,其他应用引用dll时,编译时应该是dllimport
#ifdef COMPILER_EXPORTS
#define COMPILER_EXPORTS_API __declspec(dllexport)
#else
#define COMPILER_EXPORTS_API __declspec(dllimport)

COMPILER_EXPORTS_API void Dll_Interface();
set(LIB_SRCS
	a.cpp
	b.cpp
	...
)
# 可能会出现动态库需要链接other场景
add_library(other STATIC ${LIB_SRCS})
# SHARED type用于生产dll
add_library(Mydll_Name SHARED Mydll_Name.cpp)
# 编译时定义宏,主要是Mydll_Name.h中定义的宏,用于再编译时接口是exports
target_compile_definitions(Mydll_Name PRIVATE COMPILER_EXPORTS)
target_link_libraries(Mydll_Name other)

测试dll动态库对应CmakeLists.txt

project(main)
cmake_minimum_required(VERSION 3.19)

# SHARED IMPORTED表示外部引用库,不需要进行编译
add_library(MyDll_Name SHARED IMPORTED)

#设置库的路径属性
set_target_properties(MyDll_Name PROPERTIES
    #IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/MyDll_Name .dll
    IMPORTED_IMPLIB ${CMAKE_CURRENT_SOURCE_DIR}/MyDll_Name .lib
)

add_executable(main main.cpp)
target_link_libraries(main PUBLIC MyDll_Name)

编译过程

mkdir build
cd build
cmake .. && cmake --build .

编译过程如果遇到error LNK2019: unresolved external symbol "__declspec(dllimport) void __cdecl 报错
1.检查cmake编译正确
2.main测试应用是否和dll编译对应arch是否一致(x86、x64问题)
如果报library machine type ‘x64’ conflicts with target machine type 'x86’问题
cmake --help获取编译信息,编译为64为应用来链接x64对应的dll

cmake -G 'Visual Studio 15 2017 Win64'  .. && cmake --build .

如果成功编译后,发现调用dll接口传入string类型参数或STL中类型参数、或接口返回std::string& str、std::vector<>& list
后,在dll中进行对参数进行修改、返回等操作,执行main应用后,修改或返回值都为空,请
检查dll和main编译应用是否都为release、debug、relwithdebinfo,需要双方一致;
假设都为relwithdebinfo

cmake -G 'Visual Studio 15 2017 Win64'  .. && cmake --build . --config RelWithDebInfo

执行时需要将dll放在与生成的main.exe同层级目录(Debug、RelWithDebInfo)下

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-09-04 00:51:43  更:2022-09-04 00:55:06 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 8:38:16-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码