前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >CMake常用命令的一些整理

CMake常用命令的一些整理

作者头像
混说Linux
发布于 2022-11-18 08:50:15
发布于 2022-11-18 08:50:15
1.6K00
代码可运行
举报
文章被收录于专栏:混说Linux混说Linux
运行总次数:0
代码可运行

1

CMake 是什么我就不用再多说什么了,相信大家都有接触才会看一篇文章。对于不太熟悉的开发人员可以把这篇文章当个查找手册。

1. CMake语法

1.1 指定cmake的最小版本

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cmake_minimum_required(version 版本号)

例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cmake_minimum_required(version 2.8)

1.2 定义工程名称

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#定义工程名称 
project(项目名称)

例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
project(MyTest)

1.3 显示定义变量

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
set(var [value])

例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 第一种用法,生成代码文件列表
#先直接设置SRC_LIST的值
set(SRC_LIST add.h add.cpp)
#然后再在SRC_LIST中追加main.cpp 
set(SRC_LIST ${SRC_LIST} main.cpp)

# 第二种用法,设置库生成目录或者可执行文件生成目录
set( LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib/linux) 
set( EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)

1.4 设置编译类型

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 编译静态库
add_library(库名称 STATIC 代码文件名称) 

# 编译动态库
add_library(库名称 SHARED 代码文件名称) 

# 编译可执行程序
add_executable(可执行程序名 代码文件名称)

例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 编译静态库
add_library(add STATIC add.h add.cpp)
add_library(add STATIC ${ADD_SRC} ${ADD_HDR})

# 编译动态库
add_library(add  SHARED add.h add.cpp) 
add_library(add SHARED  ${ADD_SRC} ${ADD_HDR})

# 编译可执行程序
add_executable(main add.h add.cpp mai.cpp)
add_executable(main ${MAIN_SRC} ${MAIN_HDR})

1.5 指定静态库或者动态库编译输出目录

例如将当前编译的静态库或者动态库输出到当前项目文件夹lib子目录下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
set(LIBRARY_OUTPUT_PATH  ${PROJECT_SOURCE_DIR}/lib)

1.6 指定可执行程序编译输出目录

例如将当前可执行程序输出到当前项目文件夹的bin子目录下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#设定可执行二进制文件的目录
set( EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)

1.7 设置链接库搜索目录

例如将链接库搜索目录设置为当前项目文件夹下lib/linux文件夹:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
link_directories( ${PROJECT_SOURCE_DIR}/lib/linux)

1.8 设置包含目录

例如将包含目录设置为当前项目文件夹下include文件夹:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
include_directories(${PROJECT_SOURCE_DIR}/include)

1.9 设置宏定义

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#预定义宏
add_definitions(-D宏名称)

例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
add_definitions(-DWINDOWS)
add_definitions(-DLINUX)

1.10 链接静态库

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
link_libraries(
    静态库1
    静态库2
    静态库3
    ...
)

注意,link_libraries中的静态库为全路径,常与1.7 link_directories 搭配使用,例如:

lib1.a lib2.a在目录${PROJECT_SOURCE_DIR}/lib/linux下,则先设置链接目录,再链接相应的库:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#设置链接目录
link_directories( ${PROJECT_SOURCE_DIR}/lib/linux)
link_libraries(
        lib1.a
        lib2.a
)

1.11 链接动态库

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
target_link_libraries(所需生成的文件名称 所需链接的动态库名称)

例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
target_link_libraries(main dl)

1.12 link_libraries 和 target_link_libraries 区别

在cmake语法中,link_libraries和target_link_libraries是很重要的两个链接库的方式,虽然写法上很相似,但是功能上有很大区别:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(1) link_libraries用在add_executable之前,target_link_libraries用在add_executable之后
(2) link_libraries用来链接静态库,target_link_libraries用来链接导入库,即按照header file + .lib + .dll方式隐式调用动态库的.lib库

1.13 file语法

1.13.1 将文件夹所有的类型的文件添加到文件列表

例如将当前文件夹下所有.cpp文件的文件名加入到MAIN_SRC中,将当前文件夹下所有.h加入到MAIN_HDR中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
file(GLOB MAIN_SRC ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp)
file(GLOB MAIN_HDR ${CMAKE_CURRENT_SOURCE_DIR}/*.h)

例如将当前文件夹子目录src文件夹下所有.cpp文件的文件名加入到MAIN_SRC中,将当前文件夹子目录src文件夹下所有.h加入到MAIN_HDR中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
file(GLOB MAIN_SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp)
file(GLOB MAIN_HDR ${CMAKE_CURRENT_SOURCE_DIR}/src/*.h)

1.13.2 递归搜索该文件夹,将文件夹下(包含子目录)符合类型的文件添加到文件列表

例如将当前文件夹下(包括子目录下)所有.cpp文件的文件名加入到MAIN_SRC中,所有.h加入到MAIN_HDR中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
file(GLOB_RECURSE MAIN_SRC ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp)
file(GLOB_RECURSE MAIN_HDR ${CMAKE_CURRENT_SOURCE_DIR}/*.h)

1.14 List操作

常见的List操作包括:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
list(LENGTH <list> <output variable>) 
list(GET <list> <element index> [<element index> ...]
   <output variable>)
list(APPEND <list> [<element> ...])
list(FIND <list> <value> <output variable>)
list(INSERT <list> <element_index> <element> [<element> ...])
list(REMOVE_ITEM <list> <value> [<value> ...])
list(REMOVE_AT <list> <index> [<index> ...])
list(REMOVE_DUPLICATES <list>)
list(REVERSE <list>)
list(SORT <list>)

1.14.1 List移除指定项

例如从MAIN_SRC移除指定项:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
list(REMOVE_ITEM MAIN_SRC ${CMAKE_CURRENT_SOURCE_DIR}/add.cpp)

1.14.2 将两个List链接起来

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 搜索当前目录
file(GLOB  MAIN_SRC ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp)
file(GLOB  MAIN_HDR ${CMAKE_CURRENT_SOURCE_DIR}/*.h)

# 递归搜索当前目录下src子目录
file(GLOB_RECURSE MAIN_SRC_ELSE  ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp)
file(GLOB_RECURSE MAIN_HDR_ELSE  ${CMAKE_CURRENT_SOURCE_DIR}/src/*.h)

# 将MAIN_SRC_ELSE中的值添加到MAIN_SRC 
# 将MAIN_HDR_ELSE中的值添加到MAIN_HDR 
list(APPEND MAIN_SRC ${MAIN_SRC_ELSE})
list(APPEND MAIN_HDR ${MAIN_HDR_ELSE})

1.15 添加子文件夹

例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
add_subdirectory(src)

该语句会在执行完当前文件夹CMakeLists.txt之后执行src子目录下的CMakeLists.txt

1.16 message输出消息机制

输出正常:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
message(STATUS "Enter cmake ${CMAKE_CURRENT_LIST_DIR}")

输出警告:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
message(WARNING "Enter cmake ${CMAKE_CURRENT_LIST_DIR}")

输出错误:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
message(FATAL_ERROR "Enter cmake ${CMAKE_CURRENT_LIST_DIR}")

1.17 安装

install 指令用于定义安装规则,安装的内容包括二进制可执行文件、动态库、静态库以及文件、目录、脚本等。

1.17.1 目标文件安装

例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
install(TARGETS util
  RUNTIME DESTINATION bin
  LIBRARY DESTINATION lib
  ARCHIVE DESTINATION lib)

ARCHIVE指静态库,LIBRARY指动态库,RUNTIME指可执行目标二进制,上述示例的意思是:

如果目标util是可执行二进制目标,则安装到${CMAKE_INSTALL_PREFIX}/bin目录 如果目标util是静态库,则安装到安装到${CMAKE_INSTALL_PREFIX}/lib目录 如果目标util是动态库,则安装到安装到${CMAKE_INSTALL_PREFIX}/lib目录。

1.17.2 文件夹安装

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
install(DIRECTORY include/ DESTINATION include/util)

这个语句的意思是将include/目录安装到include/util目录。

1.18 设置编译选项

设置编译选项可以通过add_compile_options命令,也可以通过set命令修改CMAKE_CXX_FLAGS或CMAKE_C_FLAGS。方式1:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -march=native -O3 -frtti -fpermissive -fexceptions -pthread")

方式2:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
add_compile_options(-march=native -O3 -fexceptions -pthread -fPIC)

这两种方式的区别在于:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
add_compile_options命令添加的编译选项是针对所有编译器的(包括c和c++编译器),而set命令设置CMAKE_C_FLAGSCMAKE_CXX_FLAGS变量则是分别只针对c和c++编译器的。

1.19 预定义变量

1.19.1 基本变量

  • PROJECT_SOURCE_DIR
  • 我们使用cmake命令后紧跟的目录,一般是工程的根目录;
  • PROJECT_BINARY_DIR 执行cmake命令的目录,通常是${PROJECT_SOURCE_DIR}/build;
  • CMAKE_INCLUDE_PATH 系统环境变量,非cmake变量;
  • CMAKE_LIBRARY_PATH 系统环境变量,非cmake变量;
  • CMAKE_CURRENT_SOURCE_DIR 当前处理的CMakeLists.txt所在的路径;
  • CMAKE_CURRENT_BINARY_DIR target编译目录(使用ADD_SURDIRECTORY(src bin)可以更改此变量的值 ,SET(EXECUTABLE_OUTPUT_PATH <新路径>)并不会对此变量有影响,只是改变了最终目标文件的存储路径);
  • CMAKE_CURRENT_LIST_FILE 输出调用这个变量的CMakeLists.txt的完整路径;
  • CMAKE_CURRENT_LIST_LINE 输出这个变量所在的行;
  • CMAKE_MODULE_PATH 定义自己的cmake模块所在的路径(这个变量用于定义自己的cmake模块所在的路径,如果你的工程比较复杂,有可能自己编写一些cmake模块,比如SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake),然后可以用INCLUDE命令来调用自己的模块);
  • EXECUTABLE_OUTPUT_PATH 重新定义目标二进制可执行文件的存放位置;
  • LIBRARY_OUTPUT_PATH 重新定义目标链接库文件的存放位置;
  • PROJECT_NAME 返回通过PROJECT指令定义的项目名称;
  • CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS 用来控制IF ELSE语句的书写方式;

1.19.2 操作系统变量

  • CMAKE_MAJOR_VERSION cmake主版本号,如3.4.1中的3;
  • CMAKE_MINOR_VERSION cmake次版本号,如3.4.1中的4;
  • CMAKE_PATCH_VERSION cmake补丁等级,如3.4.1中的1;
  • CMAKE_SYSTEM 操作系统名称,包括版本名,如Linux-2.6.22;
  • CAMKE_SYSTEM_NAME 操作系统名称,不包括版本名,如Linux;
  • CMAKE_SYSTEM_VERSION 操作系统版本号,如2.6.22;
  • CMAKE_SYSTEM_PROCESSOR 电脑处理器名称,如i686;
  • UNIX 在所有的类UNIX平台为TRUE,包括OS X和cygwin,Linux/Unix操作系统;
  • WIN32 在所有的win32平台为TRUE,包括cygwin,Windows操作系统;
  • APPLE 苹果操作系统;

例如操作系统判断方式一:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if(WIN32)
    message(STATUS “This operating system is Windows.)
elseif(UNIX)
    message(STATUS “This operating system is Linux.)
elseif(APPLE)
    message(STATUS “This operating system is APPLE.)
endif(WIN32)

操作系统判断方式二:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if (CMAKE_SYSTEM_NAME MATCHES "Linux")
    message(STATUS "current platform: Linux ")
elseif (CMAKE_SYSTEM_NAME MATCHES "Windows")
    message(STATUS "current platform: Windows")
elseif (CMAKE_SYSTEM_NAME MATCHES "FreeBSD")
    message(STATUS "current platform: FreeBSD")
else ()
    message(STATUS "other platform: ${CMAKE_SYSTEM_NAME}")
endif (CMAKE_SYSTEM_NAME MATCHES "Linux")

1.19.3 开关选项

  • BUILD_SHARED_LIBS 控制默认的库编译方式。如果未进行设置,使用ADD_LIBRARY时又没有指定库类型,默认编译生成的库都是静态库;
  • CMAKE_C_FLAGS 设置C编译选项,也可以通过指令ADD_DEFINITIONS()添加;
  • CMAKE_CXX_FLAGS 设置C++编译选项,也可以通过指令ADD_DEFINITIONS()添加;
  • CMAKE_C_COMPILER 指定C编译器
  • CMAKE_CXX_COMPILER 指定C++编译器;
  • CMAKE_BUILD_TYPE==::build 类型(Debug, Release, …) CMAKE_BUILD_TYPE=Debug

1.19.4 环境变量

设置环境变量:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
set(env{name} value)

调用环境变量:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$env{name}

例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
message(STATUS "$env{name}")

1.19.5 CMAKE_INCLUDE_CURRENT_DIR

自动添加CMAKE_CURRENT_BINARY_DIR和CMAKE_CURRENT_SOURCE_DIR到当前处理 的CMakeLists.txt。相当于在每个CMakeLists.txt加入:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
include_directories(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR})

1.20 条件判断

1.20.1 逻辑判断和比较

  • if (expression):expression 不为空时为真,false的值包括(0,N,NO,OFF,FALSE,NOTFOUND);
  • if (not exp):与上面相反;
  • if (var1 AND var2):如果两个变量都为真时为真;
  • if (var1 OR var2):如果两个变量有一个为真时为真;
  • if (COMMAND cmd):如果 cmd 确实是命令并可调用为真;
  • if (EXISTS dir) if (EXISTS file):如果目录或文件存在为真;
  • if (file1 IS_NEWER_THAN file2):当 file1 比 file2 新,或 file1/file2 中有一个不存在时为真,文件名需使用全路径;
  • if (IS_DIRECTORY dir):当 dir 是目录时为真;
  • if (DEFINED var):如果变量被定义为真;
  • if (var MATCHES regex):给定的变量或者字符串能够匹配正则表达式regex 时为真,此处 var 可以用 var 名,也可以用 ${var};
  • if (string MATCHES regex):给定的字符串能够匹配正则表达式regex时为真。

1.20.2 数字比较

  • if (variable LESS number): 如果variable小于number时为真;
  • if (string LESS number): 如果string小于number时为真;
  • if (variable GREATER number): 如果variable大于number时为真;
  • if (string GREATER number): 如果string大于number时为真;
  • if (variable EQUAL number): 如果variable等于number时为真;
  • if (string EQUAL number): 如果string等于number时为真。

1.20.3 字母表顺序比较

  • if (variable STRLESS string)
  • if (string STRLESS string)
  • if (variable STRGREATER string)
  • if (string STRGREATER string)
  • if (variable STREQUAL string)
  • if (string STREQUAL string)

1.21 循环

1.21.1 foreach

start 表示起始数,stop 表示终止数,step 表示步长

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
foreach(loop_var RANGE start stop [step])
    ...
endforeach(loop_var)

1.21.2 while

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
while(condition)
    ...
endwhile()

1.22 自动检测编译器是否支持C++11

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
include(CheckCXXCompilerFlag)
CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11)
CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X)
if(COMPILER_SUPPORTS_CXX11)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
elseif(COMPILER_SUPPORTS_CXX0X)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
else()
    message(STATUS "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support. Please use a different C++ compiler.")
endif()

1.23 CMake生成VS解决方案将项目放置在设定文件夹下

例如,我们在工程中引用了许多的第三方开源库,这些库的源码与自己所写的代码需要进行区分和隔离,通常情况下会单独开一个third筛选器存储这些第三方库的项目,怎么做?

第一步:

在第三方库的CMakeLists.txt中cmake_minimum_required(VERSION 2.6)中加上set_property(GLOBAL PROPERTY USE_FOLDERS On)

第二步:在生成编译目标的语法之后,如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
add_executable(demo demo.cpp) # 生成可执行文件
add_library(common STATIC util.cpp) # 生成静态库
add_library(common SHARED util.cpp) # 生成动态库或共享库

加入一句:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
set_target_properties(${第三方库项目名称} PROPERTIES FOLDER “目标文件夹名称”)

2. 错误解决方案 2.1 Cannot specify link libraries for target “/…/…/lib/linux/libMyDll.a” which

这个问题要将生成执行文件、静态库、动态库的声明:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
add_executable(demo demo.cpp) # 生成可执行文件
add_library(common STATIC util.cpp) # 生成静态库
add_library(common SHARED util.cpp) # 生成动态库或共享库

放在

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
target_link_libraries()

之前。

2.2 警告:检测到时钟错误,您的创建可能是不完整的

在项目根目录下执行命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
touch *

更新所有文件时间。

文章整理自网络,版权归原作者所有,如有侵权,请联系删除。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-09-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 混说Linux 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
新一代基于大数据的管理信息系统(MIS)报表需求开发
2.然后通过将数据在后台(主要使用java)封装成前台需要的格式(一般是json格式),这一步中包含了service,DAO,spring配置以及使用,struts2的配置以及使用,如sql部分过于复杂还需要使用到Mybatis的配置和使用。当然还有业务逻辑方法的代码编写。
MickyInvQ
2020/09/27
1.8K0
新一代基于大数据的管理信息系统(MIS)报表需求开发
源码分析 | Spring定时任务Quartz执行全过程源码解读
在日常开发中经常会用到定时任务,用来;库表扫描发送MQ、T+n账单结算、缓存数据更新、秒杀活动状态变更,等等。因为有了Spring的Schedule极大的方便了我们对这类场景的使用。那么,除了应用你还了解它多少呢;
小傅哥
2020/07/14
1.6K0
纳税服务系统六(信息发布管理模块)【Ueditor、异步信息交互、抽取BaseService、条件查询、分页】
需求分析 我们现在来到了纳税服务系统的信息发布管理模块,首先我们跟着原型图来进行需求分析把: 一些普通的CRUD,值得一做的就是状态之间的切换了。停用和发布切换。 值得注意的是:在信息内容中,它可以带
Java3y
2018/04/02
1.9K0
纳税服务系统六(信息发布管理模块)【Ueditor、异步信息交互、抽取BaseService、条件查询、分页】
Java+Spring 实现任务调度Quartz框架(纯Java实现+Spring实现) 读写Excel
开发工具: Myelicps2014 这里选用Quartz 的1.8.6版本,此版本在项目中应用较多,也较为稳定
Java_慈祥
2024/08/06
1610
Java+Spring 实现任务调度Quartz框架(纯Java实现+Spring实现) 读写Excel
​分布式定时任务框架Quartz
项目中总要写那么几个定时任务来处理一些事情。一些简单的定时任务使用Spring自带的定时任务就能完成。但是如果需要大量的定时任务的话要怎么才能统一管理呢?
乱敲代码
2020/05/21
4.8K0
Spring 集成Quartz
在使用jdk的timer时发现无法在指定的日期进行执行任务。这便引入一个优秀的开源任务调度框架“quartz”。这里使用的是quartz-1.8.6版本。Quart的官网:http://www.quartz-scheduler.org/;spring 3.0版本无法集成quartz 2.x及其后续版本。
HUC思梦
2020/09/03
7830
Spring 集成Quartz
玩转 SSH(七):使用 dubbo + zookeeper 实现服务模块化
一、创建 SSMVCAnnoDemo 项目 点击菜单,选择“File -> New Project” 创建新项目。选择使用 archetype 中的 maven-quickstart 模版创建。 输入
陈树义
2018/04/13
1.2K0
玩转 SSH(七):使用 dubbo + zookeeper 实现服务模块化
Quartz任务调度器
这里加入的是quartz-1.8.6版本。Quart的官网:http://www.quartz-scheduler.org/;项目中的框架的spring是spring 3.0版本无法集成quartz 2.x及其后续版本;所以这里用quartz 1.8.6版本。
intsmaze-刘洋
2018/08/29
1.2K0
Quartz任务调度器
ASP.NET MVC5+EF6+EasyUI 后台管理系统(85)-Quartz 作业调度用法详解二
前言 上一节我们学习了Quartz的基本用法 这一节学习通过XML配置的形式来执行任务 这一节主要认识一些属性,为下一步打基础 代码下载:链接:http://pan.baidu.com/s/1
用户1149182
2018/01/12
6410
ASP.NET MVC5+EF6+EasyUI 后台管理系统(85)-Quartz 作业调度用法详解二
Quartz定时任务框架使用教程详解
Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,完全由Java开发,可以用来执行定时任务,类似于java.util.Timer。但是相较于Timer, Quartz增加了很多功能:
大忽悠爱学习
2021/12/07
2.3K0
Quartz定时任务框架使用教程详解
Spring Boot整合Scheduled定时任务器、整合Quartz定时任务框架
首先说明一下,这里使用的是Springboot2.2.6.RELEASE版本,由于Springboot迭代很快,所以要注意版本问题。
别先生
2020/05/27
1.2K0
Spring Boot整合Scheduled定时任务器、整合Quartz定时任务框架
基于Quartz编写一个可复用的分布式调度任务管理WebUI组件
创业小团队,无论选择任何方案,都优先考虑节省成本。关于分布式定时调度框架,成熟的候选方案有XXL-JOB、Easy Scheduler、Light Task Scheduler和Elastic Job等等,其实这些之前都在生产环境使用过。但是想要搭建高可用的分布式调度平台,这些框架(无论是否去中心化)都需要额外的服务器资源去部署中心调度管理服务实例,甚至有时候还会依赖一些中间件如Zookeeper。回想之前花过一段时间看Quartz的源码去分析它的线程模型,想到了它可以基于MySQL,通过一个不是很推荐的X锁方案(SELECT FOR UPDATE加锁)实现服务集群中单个触发器只有一个节点(加锁成功的那个节点)能够执行,这样子,就能够仅仅依赖于现有的MySQL实例资源实现分布式调度任务管理。一般来说,有关系型数据保存需求的业务应用都会有自己的MySQL实例,这样子就能几乎零成本引入一个分布式调度管理模块。某个加班的周六下午敲定了初步方案之后,花了几个小时把这个轮子造出来了,效果如下:
Throwable
2020/06/23
8510
Spring+Quartz实现定时任务 (二)
在我们进行软件项目开发的过程中,相信大家在很多时候都会遇到如下业务场景:每天、每周或每月生成相应的业务报表;每天统计系统注册人数;定期清理平台长久不登录的用户等等。遇到这种业务场景需要怎样去处理?人为定时去数据库操作来统计?别开玩笑了,这种事情哪用得着人来做,如果像这种任务还需要专人每天都去做统计,那估计很多人就要疯掉了。针对于这种业务情况,采用定时任务是个非常不错的选择。在Java领域中,定时任务的开源工具也非常多,小到一个Timer类,大到Quartz框架。总体来说,个人比较喜欢的还是Quartz,功能
Java学习123
2018/05/16
9520
java 项目日志管理设计方案[通俗易懂]
自定义注解主要包括模块名称、操作内容两个内容,其使用方式为:@LogAnnotation(moduleName = “角色管理”, operate = “新增角色”) 如果需要其他内容,可根据以下源码进行扩展
全栈程序员站长
2022/08/31
1.6K0
quartz使用入门篇【面试+工作】
你曾经需要应用执行一个任务吗?这个任务每天或每周星期二晚上11:30,或许仅仅每个月的最后一天执行。一个自动执行而无须干预的任务在执行过程中如果发生一个严重错误,应用能够知到其执行失败并尝试重新执行吗?你和你的团队是用Java编程吗?如果这些问题中任何一个你回答是,那么你应该使用Quartz调度器。
Java帮帮
2018/07/26
2K0
quartz使用入门篇【面试+工作】
Quartz任务调度快速入门
Quartz对任务调度的领域问题进行了高度的抽象,提出了调度器、任务和触发器这3个核心的概念,并在org.quartz通过接口和类对重要的这些核心概念进行描述:
MonroeCode
2018/01/09
1.4K0
Quartz任务调度快速入门
十分钟用 Python 绘制动态排行图 —— 以 A 股历年市值前十股票排行榜为例
相信大家都曾在 YouTube 和 B 站看到过类似的视频,这种图在国外叫做 Bar Chart Race,配上一段气势磅礴的 BGM,就会营造出一种「浮沉跌宕」的沉浸感,这类型的视频很多都获得了相当可观的播放量。
davidac
2021/07/11
1.3K0
day32_Hibernate学习笔记_04
  缓存(Cache):是计算机领域非常通用的概念。它介于应用程序和永久性数据存储源(如硬盘上的文件或者数据库)之间,其作用是降低应用程序直接读写硬盘(永久性数据存储源)的频率,从而提高应用的运行性能。缓存中的数据是数据存储源中数据的拷贝。缓存的物理介质通常是内存。   缓存:程序 <-- (内存) --> 硬盘
黑泽君
2018/10/11
9940
day32_Hibernate学习笔记_04
深入Quartz,优雅地管理你的定时任务
最近在工作遇到了定时任务场景,因此特地对定时任务相关知识进行了调研,记录在此,后文中使用的代码已经上传到Github: https://github.com/ThinkMugz/springboot-demo-major,需要的伙伴儿自取。
云深i不知处
2022/05/11
4.7K0
深入Quartz,优雅地管理你的定时任务
宿舍管理系统部分代码实现
public class DBHelper { private String dbUrl="jdbc:mysql://localhost:3306/sushe"; private String dbUser="root"; private String dbPassword="123456"; private String jdbcName="com.mysql.jdbc.Driver"; public Connection getConn(){ Connection conn = null; try{ Class.forName(jdbcName); } catch(Exception e){} try{ conn=DriverManager.getConnection(dbUrl,dbUser,dbPassword); } catch(SQLException ex){} return conn; } public static void main(String[] args) { System.out.println(new DBHelper().getConn());
张哥编程
2024/12/22
1050
推荐阅读
相关推荐
新一代基于大数据的管理信息系统(MIS)报表需求开发
更多 >
LV.3
这个人很懒,什么都没有留下~
目录
  • 1.19.1 基本变量
  • 1.19.2 操作系统变量
  • 1.19.3 开关选项
  • 1.19.4 环境变量
  • 1.19.5 CMAKE_INCLUDE_CURRENT_DIR
  • 1.20 条件判断
  • 1.20.1 逻辑判断和比较
  • 1.20.2 数字比较
  • 1.20.3 字母表顺序比较
  • 1.21 循环
  • 1.21.1 foreach
  • 1.21.2 while
  • 1.22 自动检测编译器是否支持C++11
  • 1.23 CMake生成VS解决方案将项目放置在设定文件夹下
  • 第一步:
  • 第二步:在生成编译目标的语法之后,如:
  • 2. 错误解决方案 2.1 Cannot specify link libraries for target “/…/…/lib/linux/libMyDll.a” which
    • 2.2 警告:检测到时钟错误,您的创建可能是不完整的
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档