cmake官方demo学习整理

文章目录

    • cmake官方demo学习整理
    • 概述
    • 整理后的CMakeDemo目录结构
    • 主工程
    • CMakeLists.txt
    • config.h.in
    • main.cpp
    • README.txt
    • DLL工程
    • CMakeLists.txt
    • my_math.cpp
    • my_math.h
    • my_math.def
    • 备注
    • END

cmake官方demo学习整理

概述

想将iconv编译进自己的DLL, 顺便学了一下用CMake来构建工程.
CMake官方demo(12个demo)提供的功能, 有点复杂.
就学了前4个demo, 初步用CMake来构建程序, 基本够用.

整理后的CMakeDemo目录结构

$ tree
.
├── CMakeLists.txt
├── config.h.in
├── main.cpp
├── my_lib_math
│   ├── CMakeLists.txt
│   ├── my_math.cpp
│   ├── my_math.def
│   └── my_math.h
└── README.txt1 directory, 8 files

主工程

CMakeLists.txt

# --------------------------------------------------------------------------------
# PROJECT_SOURCE_DIR 默认是主CMakeLists.txt所在目录
# PROJECT_BINARY_DIR 是CMake . 所在的目录(e.g. ./build/)# --------------------------------------------------------------------------------
# 普通宏用set来定义, 在实现中就不能用#ifdef来判断这个宏了, 因为始终会为TRUE
# 如果是固定的宏, 都可以定义在CMakeLists.txt的头部
set(LINE_80 "--------------------------------------------------------------------------------")# --------------------------------------------------------------------------------
message(NOTICE ${LINE_80})
message(NOTICE "/CMakeLists.txt begin")
message(NOTICE ${LINE_80})# --------------------------------------------------------------------------------
# 编译用的CMake版本要求
cmake_minimum_required(VERSION 3.10)# --------------------------------------------------------------------------------
# 项目名称
project(prjCMakeDemo VERSION 1.0.0.0)
message(STATUS "PROJECT_NAME = ${PROJECT_NAME}")# --------------------------------------------------------------------------------
# C+=版本要求
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)# --------------------------------------------------------------------------------
# 定义编译宏
# 如果是哟个option来定义宏(BOOL量的开关宏), 可以在CMakeGUI中操作宏的打开和关闭, 可以在实现中用#ifdef来判断宏是否存在
option(USE_MYMATH "使用自己的数学库" ON)# 宏相关
if(USE_MYMATH)# 设置变量 - 自己的库名称set(MY_MATH_LIB_NAME my_lib_math)message (STATUS "MY_MATH_LIB_NAME = ${MY_MATH_LIB_NAME}")# 设置变量 - 自己的库全路径set(MY_MATH_LIB_DIR ${PROJECT_SOURCE_DIR}/my_lib_math)message (STATUS "MY_MATH_LIB_DIR = ${MY_MATH_LIB_DIR}")# endif 后面必须有() , e.g. endif(), 否则报错
endif()# --------------------------------------------------------------------------------
# 更新配置文件模板到配置文件
# 让源码和CMake定义的宏之间能有交互
# 如果是要在配置模板中更新的宏, 如果还没定义, 可以在configure_file执行之前定义
configure_file(Config.h.in ${PROJECT_SOURCE_DIR}/include/Config.h)# --------------------------------------------------------------------------------
# 在addexe之前, 必须先添加子工程的CMakeLits.txt. 否则在addexe之后连接库时, 会找不到库
if(USE_MYMATH)# 如果使用了库, 就添加库工程的CMakeLists.txtadd_subdirectory(${MY_MATH_LIB_DIR})
endif()# --------------------------------------------------------------------------------
# 添加此工程的头文件包含路径
set(MY_PRJ_INCLUDES "${PROJECT_SOURCE_DIR}" "${PROJECT_SOURCE_DIR}/include")message(STATUS "MY_PRJ_INCLUDES = ${MY_PRJ_INCLUDES}")# 添加此工程的包含路径
include_directories(${MY_PRJ_INCLUDES}
)# --------------------------------------------------------------------------------
# 更改exe输出路径为./bin
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)# 添加自己的工程为exe
add_executable(${PROJECT_NAME} main.cpp)# --------------------------------------------------------------------------------
if(USE_MYMATH)# 包含库时的参数list(APPEND MY_PRJ_LIBS ${MY_MATH_LIB_NAME})message(STATUS "MY_PRJ_LIBS = ${MY_PRJ_LIBS}")# 库的包含路径, 由字库自己去设置给主工程用# target_link_libraries 参数:# 参数1 : 主工程的名称(要链接库到这个工程)# 参数2 : 要链接的库名称target_link_libraries(${PROJECT_NAME}${MY_PRJ_LIBS})
endif()message(NOTICE ${LINE_80})
message(NOTICE "/CMakeLists.txt END")
message(NOTICE ${LINE_80})

config.h.in

// @file config.h#ifndef __CONFIG_H__
#define __CONFIG_H__#define PROJECT_NAME "@PROJECT_NAME@"
#define PROJECT_VERSION_MAJOR @PROJECT_VERSION_MAJOR@
#define PROJECT_VERSION_MINOR @PROJECT_VERSION_MINOR@
#define PROJECT_VERSION_PATCH @PROJECT_VERSION_PATCH@
#define PROJECT_VERSION_TWEAK @PROJECT_VERSION_TWEAK@
#define PROJECT_FULL_VERSION_STRING "@PROJECT_NAME@ v@PROJECT_VERSION_MAJOR@.@PROJECT_VERSION_MINOR@.@PROJECT_VERSION_PATCH@.@PROJECT_VERSION_TWEAK@"// 如果在CMakeLists.txt中没有定义xx, #cmakedefine xx 就不会出现
// USE_MYMATH 是在CMakeLists.txt中用option定义出的开关宏
#cmakedefine USE_MYMATH#endif // #ifndef __CONFIG_H__

main.cpp

#include <iostream> // for std::cout
#include <cmath> // for sqrt#include "config.h"#ifdef USE_MYMATH
#  include "my_math.h"
#endifconst char* get_prjoect_full_version()
{return PROJECT_FULL_VERSION_STRING;
}int main(int argc, char* argv[])
{#ifdef USE_MYMATHprintf("USE_MYMATH\r\n");
#elseprintf("NOT_USE_MYMATH\r\n");
#endifprintf("%s v%d.%d.%d.%d\n", PROJECT_NAME,PROJECT_VERSION_MAJOR,PROJECT_VERSION_MINOR,PROJECT_VERSION_PATCH,PROJECT_VERSION_TWEAK);if (argc < 2) {printf("%s\n", get_prjoect_full_version());std::cout << "Usage: " << argv[0] << " number" << std::endl;return 1;}const double inputValue = atof(argv[1]);#ifdef USE_MYMATHconst double outputValue = mysqrt(inputValue);
#elseconst double outputValue = sqrt(inputValue);
#endifstd::cout << "The square root of " << inputValue << " is " << outputValue<< std::endl;return 0;
}

README.txt

# @file README.txt# --------------------------------------------------------------------------------
# how to build
# --------------------------------------------------------------------------------
clear && mkdir ./build && cd ./build
clear && rm ./* -rf && cmake .. && cmake --build .

DLL工程

CMakeLists.txt

# @file my_lib_math/CMakeLists.txt# --------------------------------------------------------------------------------
# 子工程可以用父工程定义的宏, 在自己的工程中不用重复定义. e.g. LINE_80# --------------------------------------------------------------------------------
message(NOTICE ${LINE_80})
message(NOTICE "/my_lib_math/CMakeLists.txt begin")
message(NOTICE ${LINE_80})# --------------------------------------------------------------------------------
# 更改库工程输出目录为./bin
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)# 添加自己的工程为库
# add_library(<name> [STATIC | SHARED | MODULE]
# add_library 参数2可选项, STATIC 为静态库, SHARE 为动态库. 如果不写, 默认为静态库
add_library(my_lib_math SHARED my_math.cpp)# --------------------------------------------------------------------------------
# 在库的CMakeLists.txt中添加库包含路径时, 库路径前必须有 INTERFACE, 否则报错
target_include_directories(my_lib_mathINTERFACE ${CMAKE_CURRENT_SOURCE_DIR})# --------------------------------------------------------------------------------
message(NOTICE ${LINE_80})
message(NOTICE "/my_lib_math/CMakeLists.txt END")
message(NOTICE ${LINE_80})

my_math.cpp

// @file my_math.cpp#include "my_math.h"#include <iostream>double mysqrt(double x)
{if (x <= 0) {return 0;}double result = x;// do ten iterationsfor (int i = 0; i < 10; ++i) {if (result <= 0) {result = 0.1;}double delta = x - (result * result);result = result + 0.5 * delta / result;std::cout << "Computing sqrt of " << x << " to be " << result << std::endl;}return result;
}void _stdcall my_dll_fn(void)
{}

my_math.h

// @file my_math.h#ifndef __MY_MATH_H__
#define __MY_MATH_H__double mysqrt(double x);#endif // #ifndef __MY_MATH_H__

my_math.def

LIBRARY my_lib_math
; dll export function defineVERSION     1.0EXPORTSmysqrt  @2my_dll_fn @1

备注

用VS做DLL, 只有标记哪个函数要导出才会导出.
用cygwin64 + cmake, 默认是将DLL工程中所有函数都导出了. 函数暴露的有点多.
本来想着隐藏DLL中的导出函数, 但是加入.def不好使, 全部导出了. 以后再研究.

END

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/578188.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IDEA2023版如何创建web项目

一、新建项目 点击File->New->Project...&#xff0c;如果是第一次创建项目则单击New Project 二、添加Web Application 建好的样子 把web移动到main目录下同时改名为webapp 三、不存在Add Framework Support添加Web Application 如何存在Add Framework Support&#x…

运维工程师的出路揭秘:跨越35岁半衰期,探寻职业发展新路径

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 公众号&#xff1a;网络豆云计算学堂 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a; 网络豆的主页​​​​​ 目录 写在前面 本章主题 一.35岁被称为运维半衰期…

800+顶尖架构师齐聚深圳,第十届GIAC全球互联网架构大会,分享行业前沿视角与技术架构落地实践思考!(附:大会核心PPT下载)

2023年6月30-7月1日&#xff0c;由MSUP与高可用架构社区、深圳市软件行业协会联合主办的GIAC全球互联网架构大会在深圳华侨城洲际酒店圆满落幕。 本届大会邀请到了阿里、美图、腾讯、字节跳动、顺丰、华为、快手、B站等多个行业的近百位一线架构师、技术专家&#xff0c;围绕AI…

类加载器及其类加载子系统

类加载器子系统作用 类加载器子系统的作用是负责将字节码文件加载到内存中&#xff0c;并将其转化为能够被虚拟机直接使用的形式。它是Java虚拟机的一部分&#xff0c;具体作用如下&#xff1a; 加载 类加载器负责将类的字节码文件加载到虚拟机的方法区中&#xff0c;以便…

插入损耗 insertion loss

插入损耗 insertion loss 引言正文计算公式示例引言 这里给大家介绍一下,波导中插入损耗的计算公式以及一个示例。 正文 计算公式 I L = 10 log ⁡ ( P i P

L1-061:新胖子公式

题目描述 根据钱江晚报官方微博的报导&#xff0c;最新的肥胖计算方法为&#xff1a;体重(kg) / 身高(m) 的平方。如果超过 25&#xff0c;你就是胖子。于是本题就请你编写程序自动判断一个人到底算不算胖子。 输入格式&#xff1a; 输入在一行中给出两个正数&#xff0c;依次为…

前端面试题css

CSS CSS 属性是否区分大小写&#xff1f; CSS 属性名和属性值在大多数情况下是不区分大小写的&#xff0c;但也有少数例外情况&#xff0c;如 font-variant 和 text-decoration 等属性与其值中的某些字母是区分大小写的。建议在编写 CSS 代码时还是严格遵守大小写以避免不必要…

白龙地铁消费项目(地铁消费系统,包括用户端、管理端)

大一学的C#可视化项目文件&#xff0c;所有功能均可使用。可以直接下载 下方是演示照片

sigmoid softmax优化

1.前言 最近在搞模型部署发现&#xff0c;推理速度不能满足我们需求&#xff0c;于是最近学习了优化算子技巧&#xff0c;学到了sigmoid&#xff0c;softmax算子优化&#xff0c;真的数学之美。2.sigmoid算子优化 一.算子优化图 我们根据sigmoid公式&#xff0c;我们进行求反…

.NET 8 网络改进

作者&#xff1a; Mňa - Software Engineer, .NET Natalia Kondratyeva - Software Engineer, .NET 排版&#xff1a;Alan Wang 随着新的 .NET 版本的发布&#xff0c;发表有关网络空间中新的有趣变化的博客文章已经成为一种传统。今年&#xff0c;我们要介绍 HTTP 部分的变化…

Python RCL 调试劳德巴赫

Python RCL 调试劳德巴赫 比较旧的调试方式是TRACE32 Remote API, 看起来比较麻烦 新的是RCL trace32的安装路径下有官方的python教程, 用浏览器可以打开 <path>/demo/api/python/rcl/doc/html/index.html 需要先安装python库, 也在trace32安装路径下 <path>/de…

谷歌公布 2023 年最受欢迎的 Chrome 扩展

2023年&#xff0c;谷歌公布了最受欢迎的Chrome扩展&#xff0c;共有12款涵盖了多个领域&#xff0c;从提升工作效率到游戏娱乐。这些扩展旨在增强用户的浏览体验和生产力。 Scribe 功能&#xff1a;使用AI记录工作流程并创建逐步指南。 特点&#xff1a;自动记录和生成详细…

【完整项目】基于Python+Tkinter+FFD(free-form deformations)的2D彩色图像实时网格自由变形软件的设计与实现

文章目录 一、效果展示二、前言介绍三、软件使用说明3.1 环境配置3.2 文件结构3.3 准备工作 四、快速开始五、主要思路算法思路网格变形和实时操作思路 六、总结与反思七、代码链接八、其他完整项目 一、效果展示 校正比萨斜塔&#xff1a; 人脸变形&#xff1a; 图像拼接结果…

【运维】大日志文件按日期划分方法的改进及思考

之前由于运维需求&#xff0c;需要对一个大日志文件按照日期进行划分&#xff0c;将每天的日志写入一个单独的文件中。 刚开始接到这个需求后&#xff0c;我浏览了一遍日志文件&#xff0c;发现里面只有11月17号到11月22号的日志&#xff0c;天数不多&#xff0c;可以尝试手动…

conan 入门(三十七):conan 2.x通过定义环境变量(environment)执行make编译只有Makefile的项目(erpcgen)

之前一篇博客《conan 入门(三十四):conan 2.x实现对只有Makefile的项目(erpcgen)的封装示例》介绍如何用AutotoolsToolchain,Autotools实现来编译只有Makefile的项目&#xff0c;因为Autotools.make,Autotools.install方法就是执行make来编译项目。 我原本是想用self.run来执行…

C# 读取Word表格到DataSet

目录 功能需求 Office 数据源的一些映射关系 范例运行环境 配置Office DCOM 关键代码 组件库引入 ​核心代码 杀掉进程 总结 功能需求 在应用项目里&#xff0c;多数情况下我们会遇到导入 Excel 文件数据到数据库的功能需求&#xff0c;但某些情况下&#xff0c;也存…

基于VUE3+Layui从头搭建通用后台管理系统(前端篇)十七:演示功能模块相关功能实现

一、本章内容 本章实现常见业务功能,包括文章管理、商品管理、订单管理、会员管理等功能。 1. 详细课程地址: https://edu.csdn.net/course/detail/38183 2. 源码下载地址: 点击下载 二、界面预览 三、开发视频 3.1 B站视频地址:

Jenkins 自动设置镜像版本号

使用Jenkins环境变量当作镜像版本号 这样version变量就是版本号,在镜像构建的过程中可以使用 docker build 之后&#xff0c;如果有自己的镜像库&#xff0c;肯定要docker push 一下 至于部署的步骤&#xff0c;一般需要stop并删除原有的容器.我这里用的是docker-compose。同样…

如何使用 pnpm 实现前端 Monorepo项目管理

前言 随着软件开发项目变得越来越庞大和复杂&#xff0c;如何有效管理和维护代码库成为了一个重要的问题。一种流行的解决方案是 Monorepo&#xff0c;也就是在一个版本控制系统中管理所有的项目代码。 什么是 Monorepo Monorepo 是一种项目代码管理方式&#xff0c;指单个仓…

PHP-8.1.0-dev 后门命令执行漏洞复现_zerodiumvar_dump

0x00漏洞描述 PHP 8.1.0-dev 版本在2021年3月28日被植入后门&#xff0c;但是后门很快被发现并清除。当服务器存在该后门时&#xff0c;攻击者可以通过发送User-Agentt头来执行任意代码。 0x01影响范围 PHP 8.1.0-dev 0x02环境搭建 1、本次环境搭建使用vulhub中的docker环…