CMake制作动态库与静态库对比 📅 发布时间:2026/7/8 22:35:59 👁️ 浏览次数: 提示文章写完后目录可以自动生成如何生成可参考右边的帮助文档文章目录一、静态库无需导出符号的核心原因底层原理二、动态库DLL头文件不写导出符号**不行**核心规则动态库导出符号的两种标准方案方案1使用 __declspec 修饰符VS 最常用、推荐方案2使用模块定义文件.def三、完整示例基于加法函数的动态库实现1. 目录结构2. 核心代码修改include/lib.h带导出/导入宏封装src/lib.cpp实现文件无需修改修饰符src/main.cpp调用方代码无修改3. CMakeLists.txt编译动态库4. 编译与运行VS 环境5. 测试「不写导出符号」的失败场景补充方案使用 .def 文件导出符号四、关键补充说明1. 关于 extern C 的作用2. 动态库运行依赖3. CMake 自动宏的特性总结一、静态库无需导出符号的核心原因底层原理静态库本质静态库是编译后的目标文件.obj的打包归档它本身不是可独立运行的程序。链接机制生成可执行文件.exe时链接器会将静态库中被用到的代码/数据直接复制到最终的.exe内部属于静态链接。符号可见性Windows 平台下静态库的全局函数、变量默认全部公开可见链接器可以直接解析所有符号不需要__declspec(dllexport)这类导出修饰符。关键区分两种.lib文件VS 中会出现两种后缀都是.lib的文件作用完全不同库类型文件说明链接阶段行为运行时依赖静态库纯代码归档文件代码复制进.exe无额外依赖动态库配套导入库索引文件仅记录符号地址不复制代码必须依赖.dll二、动态库DLL头文件不写导出符号不行核心规则Windows 平台的DLL动态链接库有严格的符号隔离机制默认情况下DLL 内的所有全局符号都是隐藏的不会自动暴露给外部程序。如果不做显式导出声明会直接导致DLL 编译成功但不会生成导出表外部程序链接时报无法解析的外部符号错误无法调用 DLL 中的函数。补充对比Linux/macOS 的动态库.so/.dylib默认导出所有符号无需手动声明但 Windows 为了性能和安全性强制要求显式导出这是平台特性差异。动态库导出符号的两种标准方案方案1使用__declspec修饰符VS 最常用、推荐配合宏封装实现编译DLL时导出、调用DLL时导入的自动切换这是工业级标准写法。方案2使用模块定义文件.def无需修改代码通过配置文件声明导出符号适合兼容老项目。三、完整示例基于加法函数的动态库实现基于你之前的代码改造为Windows 动态库标准格式适配 VS CMake1. 目录结构cmake_demo/ ├── include/ │ └── lib.h # 带导出宏的头文件 ├── src/ │ ├── lib.cpp # 动态库实现 │ └── main.cpp # 调用方程序 └── CMakeLists.txt2. 核心代码修改include/lib.h带导出/导入宏封装为了兼容 C 名字粉碎问题添加extern C通过宏区分编译库和使用库的场景#ifndefLIB_H#defineLIB_H// 宏定义编译DLL时MYLIB_EXPORT 等价于 __declspec(dllexport)// 调用方使用时MYLIB_EXPORT 等价于 __declspec(dllimport)#ifdef_WIN32#ifdefMYLIB_SHARED_EXPORTS#defineMYLIB_API__declspec(dllexport)#else#defineMYLIB_API__declspec(dllimport)#endif#else// 非Windows平台无需导出修饰符#defineMYLIB_API#endif// 兼容C调用防止C名字改编externC{// 修饰函数标记为导出/导入符号MYLIB_APIintadd(inta,intb);}#endif// LIB_Hsrc/lib.cpp实现文件无需修改修饰符#includelib.h// 实现函数无需额外修饰intadd(inta,intb){returnab;}src/main.cpp调用方代码无修改#includestdio.h#includelib.hintmain(){intresadd(10,20);printf(10 20 %d\n,res);return0;}3. CMakeLists.txt编译动态库关键用SHARED声明动态库CMake 会自动定义MYLIB_SHARED_EXPORTS宏cmake_minimum_required(VERSION 3.15) project(AddDllDemo) set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON) # 核心SHARED 表示编译为 Windows 动态库DLL add_library(mylib SHARED src/lib.cpp) target_include_directories(mylib PUBLIC include) # 生成可执行文件 add_executable(main_app src/main.cpp) # 链接动态库 target_link_libraries(main_app PRIVATE mylib)4. 编译与运行VS 环境用 CMake 生成 VS 解决方案编译工程输出目录会生成两个关键文件mylib.dll运行时库、mylib.lib导入库直接运行main_app.exe可正常调用 DLL 中的add函数。5. 测试「不写导出符号」的失败场景如果删除头文件中的MYLIB_API修饰符直接声明函数// 错误写法无导出修饰符externCintadd(inta,intb);编译后DLL 可正常生成但无导出符号链接main_app时VS 直接报错无法解析的外部符号 add程序无法运行。补充方案使用.def文件导出符号如果不想修改代码可以新建mylib.def文件手动声明导出符号LIBRARY mylib EXPORTS add 1在 CMake 中添加配置target_sources(mylib PRIVATE mylib.def)此时代码中无需任何导出修饰符链接器会根据.def文件导出符号同样可以正常调用。四、关键补充说明1. 关于extern C的作用C 编译器会对函数名做名字粉碎Name Mangling导致外部调用时符号不匹配添加extern C会强制使用 C 语言的符号命名规则保证跨调用约定兼容。2. 动态库运行依赖静态库编译后.exe可独立运行动态库编译后必须将xxx.dll放在.exe同级目录否则运行时会报错「找不到依赖库」。3. CMake 自动宏的特性当你用add_library(xxx SHARED ...)时CMake 会自动生成XXX_EXPORTS宏这也是我们封装MYLIB_API的依据无需手动定义。总结静态库.lib无需任何导出符号全局符号默认公开链接时代码直接嵌入.exe这是你能直接调用函数的原因Windows 动态库.dll必须显式导出符号不写导出修饰符会导致链接失败推荐用__declspec(dllexport/dllimport) 宏封装的标准写法两种.lib文件切勿混淆静态库是代码归档动态库配套的.lib仅为符号索引导入库。
价值投资中的择股技巧 价值投资中的择股技巧 关键词:价值投资、择股技巧、基本面分析、财务指标、行业分析 摘要:本文围绕价值投资中的择股技巧展开深入探讨。首先介绍了价值投资及择股技巧的背景知识,包括目的、预期读者、文档结构和相关术语。接着阐述了核心概念… 2026/7/7 20:12:07
【机械臂路径规划】基于约束的增量拓展随机树CBiRRT算法实现机械臂机器人路径规划附Matlab复现和论文 ✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和… 2026/5/17 2:30:27
面壁智能发布 MiniCPM-o 4.5,端侧全双工实时音视频交互;海马爸比推出首款 AI 魔法打印机,语音生图+即时打印丨日报 开发者朋友们大家好: 这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的技术」、「有亮点的产品」、「有思考的文章」、「有态度的观点」、「… 2026/5/17 2:30:26
PyTorch 2.0+ 深度学习调参实战:AdamW + Cosine 退火策略在 CV 任务中的 5 个关键参数 PyTorch 2.0 深度学习调参实战:AdamW与Cosine退火策略的工程化实践 1. 深度学习调参的本质与挑战 在计算机视觉任务中,模型性能的瓶颈往往不在于架构创新,而在于超参数的系统性优化。PyTorch 2.0引入的编译优化和计算图改进,使得… 2026/7/8 22:32:18
PyTorch 2.0 线性回归实战:从 15 个样本到 60 轮训练,Loss 降至 0.001 PyTorch 2.0 线性回归实战:15样本60轮训练实现Loss0.001的完整指南 1. 线性回归与PyTorch基础认知 线性回归作为机器学习领域的"Hello World",其核心思想是通过线性方程ywxb拟合数据分布。PyTorch 2.0通过动态计算图和自动微分机制࿰… 2026/7/8 22:32:18
从残差分析到模型优化:线性回归的4个实战陷阱与解决方案 从残差分析到模型优化:线性回归的4个实战陷阱与解决方案在数据科学项目中,线性回归模型往往是最先被尝试的算法,但也是最容易被低估的建模工具。许多分析师在模型表现不佳时,第一反应是转向更复杂的算法,却忽略了线性回… 2026/7/8 22:30:17
PInVerify:具身AI实例级指代验证离线基准 1. 项目概述:这不是又一个“刷榜”数据集,而是一把量尺如果你最近在具身AI(Embodied AI)领域泡得久,大概率已经听过“物理AI”和“具身智能”这两个词被反复提起,甚至有人开始混淆——前者强调系统与真实物… 2026/7/8 22:28:15
AI内衣换装系统本地私有化部署:技术架构与商业应用实战 🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 稳定商业AI内衣换装全流程软件:本地私有化部署实战指南 在电商和服装设计领域,AI换装技术正从概念验证走向商业… 2026/7/8 22:28:15
LTX-Video V1.6:基于int8量化的AI视频生成工具部署与优化指南 🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 在本地部署AI视频生成工具时,很多开发者都面临显存不足、环境配置复杂、生成速度慢三大痛点。特别是想要实现文字或图片生… 2026/7/8 22:26:13
BetterNCM安装器:高效管理网易云插件的最佳选择 BetterNCM安装器:高效管理网易云插件的最佳选择 【免费下载链接】BetterNCM-Installer 一键安装 Better 系软件 项目地址: https://gitcode.com/gh_mirrors/be/BetterNCM-Installer 还在为网易云音乐插件的繁琐安装流程而烦恼吗?BetterNCM安装器是… 2026/7/8 0:02:48
运动控制系统安全设置对比:ECI3808的3种限位保护与急停逻辑实现 运动控制系统安全机制深度解析:限位保护与急停逻辑的设计哲学在精密制造与自动化领域,运动控制系统的安全设计绝非简单的功能堆砌,而是一套融合了机械工程、电气原理和软件算法的防御体系。当一台数控机床以每分钟数万转的速度运转࿰… 2026/7/8 0:06:48
AI大模型应用开发:小白也能抓住的红利风口,收藏这篇入门指南! 文章指出,虽然微软等科技巨头在裁员,但英伟达等公司却在积极扩招AI相关人才,尤其是具身智能、仿真等领域。AI行业正在经历结构性调整,传统岗位被淘汰,而大模型应用开发等新岗位需求旺盛。对于想转行或学习AI的普通人来… 2026/7/8 0:10:49
6个月转型AI工程师:实战路径与核心技能 1. 项目概述:6个月转型AI工程师的可行性路径在2023年大模型技术爆发的背景下,AI工程师岗位需求同比增长217%(LinkedIn数据)。不同于传统算法工程师需要3-5年培养周期,现代AI工程师更侧重工程化落地能力。我在硅谷科技公… 2026/7/7 11:26:57
TPAFE0808与PIC18F87K22的多通道信号采集方案 1. 项目背景与核心需求在工业自动化、医疗设备和科研仪器等领域,多通道信号采集与系统监测是基础且关键的技术需求。传统方案往往面临通道数量不足、信号调理复杂、系统集成度低等问题。TPAFE0808作为一款8通道模拟前端芯片,与PIC18F87K22微控制器的组合… 2026/7/8 20:15:17
STC3115与PIC18LF26K80构建高精度电池管理系统 1. STC3115与PIC18LF26K80在电池管理系统中的核心价值在现代电子设备中,电池管理系统(BMS)的重要性不亚于设备的核心处理器。STC3115作为一款高精度电池电量监测IC,与PIC18LF26K80微控制器的组合,构成了一个既能精确监控又能智能管理的完整解… 2026/7/8 14:25:08