CMake系列EP02: 构建可执行程序和库
文章目录
- cmake --build
- message命令
- 切换生成器
- 使用ninja构建项目
- 切换生成器的工作原理
- 构建和链接静态库和动态库
- add_library命令
- add_executable命令
- 构建OBJECT类型的库
- 条件编译
- opion命令
- option更多信息
- 指定编译器
- 构建类型
- 切换构建类型:
- 设置编译器选项
- cmake调试
- 设置语言标准
- 另外一种写法
- list命令
cmake --build
$ cmake -Bbuild .
该命令是跨平台的,使用了-H
和-B
为CLI选项。-H
表示当前目录中搜索根CMakeLists.txt
文件。-Bbuild
告诉CMake在一个名为build
的目录中生成所有的文件。
➜ build cmake --build . --target help
The following are some of the valid targets for this Makefile:
… all (the default if no target is provided)
… clean
… depend
… rebuild_cache
… edit_cache
… helloworld
CMake生成的目标比构建可执行文件的目标要多。可以使用cmake --build . --target <target-name>
语法,实现如下功能:
- all(或Visual Studio generator中的ALL_BUILD)是默认目标,将在项目中构建所有目标。
- clean,删除所有生成的文件。
- rebuild_cache,将调用CMake为源文件生成依赖(如果有的话)。
- edit_cache,这个目标允许直接编辑缓存。
对于更复杂的项目,通过测试阶段和安装规则,CMake将生成额外的目标:
- test(或Visual Studio generator中的RUN_TESTS)将在CTest的帮助下运行测试套件。
- install,将执行项目安装规则。
- package,此目标将调用CPack为项目生成可分发的包。
message命令
message :为用户显示一条消息
语法:
message( [STATUS|WARNING|AUTHOR_WARNING|FATAL_ERROR|SEND_ERROR]"message to display" ...)
可以用下述可选的关键字指定消息的类型:
- (无) = 重要消息;
- STATUS = 非重要消息;
- WARNING = CMake 警告, 会继续执行;
- AUTHOR_WARNING = CMake 警告 (dev), 会继续执行;
- SEND_ERROR = CMake 错误, 继续执行,但是会跳过生成的步骤;
- FATAL_ERROR = CMake 错误, 终止所有处理过程;
切换生成器
➜ cmake --help
GeneratorsThe following generators are available on this platform (* marks default):
* Unix Makefiles = Generates standard UNIX makefiles.Ninja = Generates build.ninja files.Watcom WMake = Generates Watcom WMake makefiles.CodeBlocks - Ninja = Generates CodeBlocks project files.CodeBlocks - Unix Makefiles = Generates CodeBlocks project files.CodeLite - Ninja = Generates CodeLite project files.CodeLite - Unix Makefiles = Generates CodeLite project files.Sublime Text 2 - Ninja = Generates Sublime Text 2 project files.Sublime Text 2 - Unix Makefiles= Generates Sublime Text 2 project files.Kate - Ninja = Generates Kate project files.Kate - Unix Makefiles = Generates Kate project files.Eclipse CDT4 - Ninja = Generates Eclipse CDT 4.0 project files.Eclipse CDT4 - Unix Makefiles= Generates Eclipse CDT 4.0 project files.
使用ninja构建项目
➜ cmake_tutorial mkdir -p build
➜ cmake_tutorial cd build
➜ build ls
➜ build cmake -G Ninja …
– The C compiler identification is GNU 4.8.5
– The CXX compiler identification is GNU 4.8.5
– Check for working C compiler: /usr/bin/cc
– Check for working C compiler: /usr/bin/cc – works
– Detecting C compiler ABI info
– Detecting C compiler ABI info - done
– Detecting C compile features
– Detecting C compile features - done
– Check for working CXX compiler: /usr/bin/c++
– Check for working CXX compiler: /usr/bin/c++ – works
– Detecting CXX compiler ABI info
– Detecting CXX compiler ABI info - done
– Detecting CXX compile features
– Detecting CXX compile features - done
– Configuring done
– Generating done
– Build files have been written to: /root/workspace/cmake_tutorial/build
构建项目
➜ build cmake --build . -j8
[2/2] Linking CXX executable EP01_helloworld/helloworld➜ build ls
build.ninja CMakeCache.txt CMakeFiles cmake_install.cmake EP01_helloworld rules.ninja
切换生成器的工作原理
与前一个配置相比,每一步的输出没什么变化。每个生成器都有自己的文件集,所以编译步骤的输出和构建目录的内容是不同的:
build.ninja
和rules.ninja
:包含Ninja的所有的构建语句和构建规则。CMakeCache.txt
:CMake会在这个文件中进行缓存,与生成器无关。CMakeFiles
:包含由CMake在配置期间生成的临时文件。cmake_install.cmake
:CMake脚本处理安装规则,并在安装时使用。
cmake --build .
将ninja
命令封装在一个跨平台的接口中。
构建和链接静态库和动态库
add_library命令
在CMake中,add_library命令的基本语法如下:
add_library( <SHARED|STATIC|MODULE|INTERFACE> [source1] [source2…]) 其中, 是你要创建的库的名称, <SHARED|STATIC|MODULE|INTERFACE> 用于指定库的类型。什么都不指定,默认构建静态库。
add_executable命令
命令格式:
add_executable ( [ WIN32] [ MACOSX_BUNDLE] [ EXCLUDE_FROM_ALL] [source1] [source2 …])
add_executable ( IMPORTED [ GLOBAL ])
add_executable ( ALIAS )
使用指定的源文件来生成目标可执行文件。
示例:
add_library(message#STATICSHAREDmessage.hmessage.cpp)add_executable(helloworld_lib helloworld_lib.cpp)
target_link_libraries(helloworld_lib message)
CMake接受<SHARED|STATIC|MODULE|INTERFACE> 作为add_library
的第二个参数的有效值:
- STATIC:用于创建静态库,即编译文件的打包存档,以便在链接其他目标时使用,例如:可执行文件。
- SHARED:用于创建动态库,即可以动态链接,并在运行时加载的库。可以在
CMakeLists.txt
中使用add_library(message SHARED Message.hpp Message.cpp)
从静态库切换到动态共享对象(DSO)。 - OBJECT:可将给定
add_library
的列表中的源码编译到目标文件,不将它们归档到静态库中,也不能将它们链接到共享对象中。如果需要一次性创建静态库和动态库,那么使用对象库尤其有用。我们将在本示例中演示。 - MODULE:又为DSO组。与
SHARED
库不同,它们不链接到项目中的任何目标,不过可以进行动态加载。该参数可以用于构建运行时插件。
CMAKE_POSITION_INDEPENDENT_CODE
- 该值是POSITION_INDEPENDENT_CODE的默认值。
- 此变量用于初始化所有目标上的POSITION_INDEPENDENT_CODE属性。有关其他信息,请参见该目标属性。如果设置,则try_compile()命令也会使用该值。
POSITION_INDEPENDENT_CODE - 是否创建与位置无关的目标。
- POSITION_INDEPENDENT_CODE属性确定是否创建位置无关的可行性文件或共享库。对于SHARED和MODULE库目标,此属性默认为True,否则为False。如果在创建目标时设置了此属性,则该属性由CMAKE_POSITION_INDEPENDENT_CODE变量的值初始化。
构建OBJECT类型的库
add_library(message-objsOBJECTmessage.hmessage.cpp
)# this is only needed for older compilers
# but doesn't hurt either to have it
set_target_properties(message-objsPROPERTIESPOSITION_INDEPENDENT_CODE 1
)add_library(message-sharedSHARED$<TARGET_OBJECTS:message-objs> )add_library(message-staticSTATIC$<TARGET_OBJECTS:message-objs>
)add_executable(hello-world helloworld_lib.cpp)
target_link_libraries(hello-world message-static)
条件编译
在以下代码片段中,我们介绍了两个变量:USE_LIBRARY
和BUILD_SHARED_LIBS
。这两个变量都设置为OFF
。如CMake语言文档中描述,逻辑真或假可以用多种方式表示:
- 如果将逻辑变量设置为以下任意一种:
1
、ON
、YES
、true
、Y
或非零数,则逻辑变量为true
。 - 如果将逻辑变量设置为以下任意一种:
0
、OFF
、NO
、false
、N
、IGNORE、NOTFOUND
、空字符串,或者以-NOTFOUND
为后缀,则逻辑变量为false
。
USE_LIBRARY
变量将在第一个和第二个行为之间切换。BUILD_SHARED_LIBS
是CMake的一个全局标志。因为CMake内部要查询BUILD_SHARED_LIBS
全局变量,所以add_library
命令可以在不传递STATIC/SHARED/OBJECT
参数的情况下调用;如果为false
或未定义,将生成一个静态库。
# option(USE_LIBRARY "Compile sources into a library" OFF)
set(USE_LIBRARY OFF)
message(STATUS "Compile sources into a library? ${USE_LIBRARY}")
set(BUILD_SHARED_LIBS OFF)
list(APPEND _sources message.h message.cpp)if(USE_LIBRARY)add_library(message ${_sources})add_executable(hello-world helloworld_lib.cpp)target_link_libraries(hello-world message)
else()add_executable(hello-world helloworld_lib.cpp ${_sources})
endif()
opion命令
option
可接受三个参数:
option(<option_variable> "help string" [initial value])
<option_variable>
表示该选项的变量的名称。"help string"
记录选项的字符串,在CMake的终端或图形用户界面中可见。[initial value]
选项的默认值,可以是ON
或OFF
。
option更多信息
有时选项之间会有依赖的情况。示例中,我们提供生成静态库或动态库的选项。但是,如果没有将USE_LIBRARY
逻辑设置为ON
,则此选项没有任何意义。CMake提供cmake_dependent_option()
命令用来定义依赖于其他选项的选项:
include(CMakeDependentOption)# second option depends on the value of the first
cmake_dependent_option(MAKE_STATIC_LIBRARY "Compile sources into a static library" OFF"USE_LIBRARY" ON)# third option depends on the value of the first
cmake_dependent_option(MAKE_SHARED_LIBRARY "Compile sources into a shared library" ON"USE_LIBRARY" ON)
如果USE_LIBRARY
为ON
,MAKE_STATIC_LIBRARY
默认值为OFF
,否则MAKE_SHARED_LIBRARY
默认值为ON
。可以通过cmake命令行指定变量的值:
$ cmake -D USE_LIBRARY=OFF -D MAKE_SHARED_LIBRARY=ON ..
这仍然不会构建库,因为USE_LIBRARY
仍然为OFF
。
CMake有适当的机制,通过包含模块来扩展其语法和功能,这些模块要么是CMake自带的,要么是定制的。本例中,包含了一个名为CMakeDependentOption
的模块。如果没有include
这个模块,cmake_dependent_option()
命令将不可用。参见 https://cmake.org/cmake/help/latest/module/CMakeDependentOption.html
TIPS:手册中的任何模块都可以以命令行的方式使用cmake --help-module <name-of-module>
。例如,cmake --help-module CMakeDependentOption
将打印刚才讨论的模块的手册页(帮助页面)。
指定编译器
如何选择一个特定的编译器?例如,如果想使用Intel或Portland Group编译器怎么办?CMake将语言的编译器存储在 CMAKE_<LANG>_COMPILER
变量中,其中 <LANG>
是受支持的任何一种语言,对于我们的目的是CXX
、C
或Fortran
。用户可以通过以下两种方式之一设置此变量:
-
使用CLI中的
-D
选项,例如:$ cmake -D CMAKE_CXX_COMPILER=clang++ ..
-
通过导出环境变量
CXX
(C++编译器)、CC
(C编译器)和FC
(Fortran编译器)。例如,使用这个命令使用clang++
作为C++
编译器:$ env CXX=clang++ cmake ..
-
Make提供
--system-information
标志,它将把关于系统的所有信息转储到屏幕或文件中。要查看这个信息,请尝试以下操作:$ cmake --system-information information.txt
构建类型
CMake可以配置构建类型,例如:Debug、Release等。配置时,可以为Debug或Release构建设置相关的选项或属性,例如:编译器和链接器标志。控制生成构建系统使用的配置变量是CMAKE_BUILD_TYPE
。该变量默认为空,CMake识别的值为:
- Debug:用于在没有优化的情况下,使用带有调试符号构建库或可执行文件。
- Release:用于构建的优化的库或可执行文件,不包含调试符号。
- RelWithDebInfo:用于构建较少的优化库或可执行文件,包含调试符号。
- MinSizeRel:用于不增加目标代码大小的优化方式,来构建库或可执行文件
if(NOT CMAKE_BUILD_TYPE)set(CMAKE_BUILD_TYPE Release CACHE STRING "Build type" FORCE)
endif()
message(STATUS "Build type: ${CMAKE_BUILD_TYPE}")
切换构建类型:
cmake -D CMAKE_BUILD_TYPE=Debug …
下面是对Visual Studio的CMake调用:
$ mkdir -p build
$ cd build
$ cmake .. -G"Visual Studio 12 2017 Win64" -D CMAKE_CONFIGURATION_TYPES="Release;Debug"
将为Release和Debug配置生成一个构建树。然后,您可以使--config
标志来决定构建这两个中的哪一个:
$ cmake --build . --config Release
NOTE:当使用单配置生成器开发代码时,为Release版和Debug创建单独的构建目录,两者使用相同的源代码。这样,就可以在两者之间切换,而不用重新配置和编译。
设置编译器选项
list(APPEND flags "-fPIC" "-Wall")
if(NOT WIN32)list(APPEND flags "-Wextra" "-Wpedantic")
endif()target_compile_options(geometry
PRIVATE${flags}
)
— 分割线 —
add_executable(compute-areas compute-areas.cpp)
# 为可执行目标设置了编译选项:
target_compile_options(compute-areasPRIVATE"-fPIC")
target_link_libraries(compute-areas geometry)
本例中,警告标志有-Wall
、-Wextra
和-Wpedantic
,将这些标示添加到geometry
目标的编译选项中; compute-areas
和 geometry
目标都将使用-fPIC
标志。编译选项可以添加三个级别的可见性:INTERFACE
、PUBLIC
和PRIVATE
。
可见性的含义如下:
- PRIVATE,编译选项会应用于给定的目标,不会传递给与目标相关的目标。我们的示例中, 即使
compute-areas
将链接到geometry
库,compute-areas
也不会继承geometry
目标上设置的编译器选项。 - INTERFACE,给定的编译选项将只应用于指定目标,并传递给与目标相关的目标。
- PUBLIC,编译选项将应用于指定目标和使用它的目标。
目标属性的可见性CMake的核心,以这种方式添加编译选项,不会影响全局CMake变量CMAKE_<LANG>_FLAGS_<CONFIG>
,并能更细粒度控制在哪些目标上使用哪些选项。
cmake调试
cmake --build . – VERBOSE=1
cmake --build . -j8 --verbose
cmake -DCMAKE_VERBOSE_MAKEFILE=ON …
设置语言标准
if(NOT CMAKE_C_STANDARD)
set(CMAKE_C_STANDARD 11)
set(CMAKE_C_STANDARD_REQUIRED ON)
set(CMAKE_C_EXTENSIONS OFF)
endif()if(NOT CMAKE_CXX_STANDARD)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
endif()
另外一种写法
add_executable(animal-farm animal-farm.cpp)
set_target_properties(animal-farm
PROPERTIES
CXX_STANDARD 14
CXX_EXTENSIONS OFF
CXX_STANDARD_REQUIRED ON
)
- CXX_STANDARD会设置我们想要的标准。
- CXX_EXTENSIONS告诉CMake,只启用
ISO C++
标准的编译器标志,而不使用特定编译器的扩展。 - CXX_STANDARD_REQUIRED指定所选标准的版本。如果这个版本不可用,CMake将停止配置并出现错误。当这个属性被设置为
OFF
时,CMake将寻找下一个标准的最新版本,直到一个合适的标志。这意味着,首先查找C++11
,然后是C++98
。
list命令
cmake的list命令即对列表的一系列操作,cmake中的列表变量是用分号;分隔的一组字符串,创建列表可以使用set命令(参考set命令),例如:set (var a b c d)创建了一个列表 “a;b;c;d”,而set (var “a b c d”)则是只创建了一个变量"a c c d"。list命令的具体格式根据子命令不同会有所区别
list(LENGTH <list><output variable>)list(GET <list> <elementindex> [<element index> ...]<output variable>)list(APPEND <list><element> [<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>)
我们可以看到,list命令的格式如下
list (subcommand <list> [args...])
subcommand为具体的列表操作子命令,例如读取、查找、修改、排序等。为待操作的列表变量,[args…]为对列表变量操作需要使用的参数表,不同的子命令对应的参数也不一致。
ENGTH
返回list的长度GET
返回list中index的element到value中APPEND
添加新element到list中FIND
返回list中element的index,没有找到返回-1INSERT
将新element插入到list中index的位置REMOVE_ITEM
从list中删除某个elementREMOVE_AT
从list中删除指定index的elementREMOVE_DUPLICATES
从list中删除重复的elementREVERSE
将list的内容反转SORT
将list按字母顺序排序
示例:
list(APPEND sources_with_lower_optimizationgeometry_circle.cppgeometry_rhombus.cpp)
相关文章:
CMake系列EP02: 构建可执行程序和库
文章目录 cmake --buildmessage命令切换生成器使用ninja构建项目切换生成器的工作原理 构建和链接静态库和动态库add_library命令add_executable命令构建OBJECT类型的库条件编译opion命令option更多信息 指定编译器构建类型切换构建类型: 设置编译器选项cmake调试设…...

比亚迪今年的薪资。。
大家或许已经对比亚迪在西安的宣讲会有所耳闻,那场面真的是座无虚席。如果你稍微迟到了一些,那么你可能只能在门外或是走廊听了。 事实上,许多人早早地抵达了,只要稍微晚到,就可能错过了室内的位置。 更令人震惊的是&…...

【OpenCV实现图像找到轮廓的不同特征,就像面积,周长,质心,边界框等等。】
文章目录 概要图像矩凸包边界矩形 概要 OpenCV是一个流行的计算机视觉库,它提供了许多图像处理和分析功能,其中包括查找图像中物体的轮廓。通过查找轮廓,可以提取许多有用的特征,如面积、周长、质心、边界框等。 以下是几种使用…...
数仓建模—数仓建设概论
数仓建设概论 文章目录 数仓建设概论什么是数据仓库数据仓库对企业的意义1.全面掌握企业数据2.支持企业的决策制定3. 可靠性高怎么做数据仓库建1. 需求分析2. 设计数据仓库架构3. 数据采集4. 数据清洗5. 数据结构设计6. 数据分析7. 数据可视化8. 数据维护总结前面我们介绍了关于…...

Docker dnmp 多版本php安装 php8.2
Laravel9 开发需要用到php8.1以上的版本,而dnmp只支持到php8.0。安装php8.2的步骤如下: 1. 从/services/php80目录复制一份出来,重命名为php82,extensions目录只保留 install.sh 和 install-php-extensions 这两个文件 2. 修改.en…...
Distilling the Knowledge in a Neural Network【论文解析】
Distilling the Knowledge in a Neural Network 知识蒸馏 摘要1 引言摘要 提高几乎任何机器学习算法性能的一种非常简单的方法是在相同的数据上训练许多不同的模型,然后对它们的预测进行平均处理[3]。不幸的是,使用整个模型集合进行预测既繁琐又可能过于计算密集,特别是如果…...
基于深度学习的自动驾驶汽车语义分割与场景标注算法研究。
自动驾驶汽车是当前研究的热点领域之一,其中基于深度学习的语义分割与场景标注算法在自动驾驶汽车的视觉感知中具有重要作用。本文将围绕自动驾驶汽车的语义分割与场景标注算法展开研究。 一、研究背景 随着人工智能技术的不断发展,自动驾驶汽车逐渐成…...
国内可用超丝滑ChatGPT4.0(附网址及微信入口)
镜像网站的设置可以带来以下优势: 1.提高访问速度:由于镜像网站部署在全球不同的服务器上,用户可以从最近的服务器访问网站,从而减少延迟和提高加载速度。 2.增加可用性:如果主网站遭遇故障或网络拥堵,用…...

linux入门---线程的同步
目录标题 什么是同步生产者和消费者模型三者之间的关系消费者生产者模型改进生产者消费者模型特点条件变量的作用条件变量有关的函数条件变量的理解条件变量的使用 什么是同步 这里通过一个例子来带着大家了解一下什么是同步,在生活中大家肯定遇到过排队的情景比如…...

UI设计一定不能错过的4款常用工具
虽然设计审美很重要,但软件只是一种工具,但就像走楼梯和坐电梯到达顶层一样,电梯的效率显然更高,易于使用的设计工具也是如此。让我们了解一下UI设计的主流软件,以及如何选择合适的设计软件。 即时设计 软件介绍 即…...

JavaScript 基础 - 第2天
理解什么是流程控制,知道条件控制的种类并掌握其对应的语法规则,具备利用循环编写简易ATM取款机程序能力 运算符语句综合案例 运算符 算术运算符 数字是用来计算的,比如:乘法 * 、除法 / 、加法 、减法 - 等等,所以经…...
MyBatis和JDBC异同点
MyBatis和JDBC是两种不同的数据库访问技术,它们有以下几点区别: 抽象层级:JDBC(Java Database Connectivity)是Java提供的一种标准API,用于与数据库进行交互。它提供了一系列的接口和类,使开发人…...
关于yarn安装一些东西报错时的处理方法
The engine "node" is incompatible with this module. Expected version "^14.18.0 || ^16.14.0 || >18.0.0". Got "17.9.0"出现遮掩刮得错误时直接使用这个命令 yarn config set ignore-engines true 忽略错误就可以了 直接安装自己想安装…...

datagrip 使用自定义参数
两种使用方法: 1. 直接打问号❓,执行的时候会问你这个问号填什么 2. 设置参数,执行的时候会问你这个参数填什么 格式:${xxxx} xxxx是你定义的参数名字 SELECT ${column_name} FROM actor WHERE actor_id${actor_id} 执行就会问…...
css实现平行四边形按钮
当使用CSS实现平行四边形按钮时,可以使用transform属性和::before或::after伪元素来创建。下面是一个示例代码: <!DOCTYPE html> <html> <head> <style> .button {width: 150px;height: 50px;background-color: #4CAF50;color: …...

Jmeter只能做性能测试吗?
Jmeter除了可以性能测试,还能做接口测试 1、Jmeter和Fiddler,Postman有什么区别? Fiddler:虽然有接口测试功能,很少用来做接口测试。 一般用Fiddle来做抓包和异常测试,辅助接口测试。Postman: 是接口调试…...

Jmeter调用测试片段 —— 模块控制器
可以使用模块控制器调用测试片段。模块控制器提供了一种在运行时将测试片段替换为当前测试计划的机制。测试片段可以位于任何线程组中。 1、打开一个Jmeter窗口,添加好线程组、用户定义变量、模块控制器、测试片段、察看结果树。 2、用户定义变量同样定义好访问ip及…...
数组类型题目总结
跟着代码随想录的算法训练营进行训练 目前刷的数组 大部分都是需要遍历后 修改、移动、覆盖元素。 在不使用额外辅助空间的情况下: 在需要进行前后元素对比,使用双层for循环遍历的题目,有增删改查的操作时,就可以考虑使用双指针进…...

机器学习2:决策树--基于信息增益的ID3算法
1.决策树的简介 建立决策树的过程可以分为以下几个步骤: 计算每个特征的信息增益或信息增益比,选择最优的特征作为当前节点的划分标准。根据选择的特征将数据集划分为不同的子集。对每个子集递归执行步骤 1 和步骤 2,直到满足终止条件。构建决策树,并输出。基于信息增益的…...
centos7完全卸载和安装mysql8
问题描述 最近安装了MYSQL8,遇到了各种问题,总体汇总一下,凡是无法启动就是my.cnf和初始化的参数不匹配。 第一种 启动前设置了mysqld --initialize --usermysql --lower-case-table-names1,my.cnf文件却没有修改就去启动。 第…...
常用的解析XML的开源库
以下是一些常用的解析XML的开源库: DOM4J:DOM4J是一个基于Java的XML处理库,提供了DOM、SAX和StAX三种解析方式,可以解析和操作XML文档。它提供了丰富的API,可以用于生成、处理和解析XML文档。JAXB:JAXB是一个基于Java的XML处理库,它可以将Java对象映射到XML文档,也可以将XML文…...

SQLITE3 函数接口
简述 sqlite3 接口的核心元素: 两大对象,八大函数; 其中两个对象指的是: sqlite3 数据库连接对象 数据库的连接句柄(数据库的文件描述符) 代表你打开的那个 sqlite3 的数据库文件,后序对数据库的操作都需要用到这个对象 sqlite3_stmt SQL 语句对象…...

RISC-V IDE MRS无感远程协助模块详解
RISC-V IDE MRS无感远程协助模块详解 一、说明 1.1 概述 针对RISC-V/ARM等内核MCU的嵌入式集成开发环境MRS(MounRiver Studio)从V1.90版本开始内置无感远程协助模块(Sensorless Remote Assistant Module,以下简称SRA模块)。SRA模块是一款支…...
APA技术方案及关键点
APA即我们平时用的最多的基础泊车功能(自动泊车辅助),按照功能来分,有下列子功能: 1.AVM(全景影像),四路环视鱼眼动态拼接,去畸变,提供给用户车身周围360的环境图像信息,有2D(单路鱼眼图)&…...

WordPress外链页面安全跳转插件
老白博客我参照csdn和腾讯云的外链跳转页面,写了一个WordPress外链安全跳转插件:给网站所有第三方链接添加nofollow标签和重定向功能,提高网站安全性。插件包括两个样式,由于涉及到的css不太一样,所以分别写了两个版本…...

【牛客网】安全—加密和安全
每日一练 Day1: 1.信息安全的基本属性是( D ) A.保密性 B.完整性 C.可用性,可靠性,可控性 D.A、B、C都是 信息安全的基本属性通常可以归纳为以下几个方面: 保密性(Confidentiality…...

Mybatis基础操作
基础操作 增删改查 Select 是查询类的注解,所有的查询均使用这个Result 修饰返回的结果集,关联实体类属性和数据库字段一一对应,如果实体类属性和数据库属性名保持一致,就不需要这个属性来修饰。Insert 插入数据库使用ÿ…...

Java实验二类编程实验
1.编写一个代表三角形的类(Triangle.java)。 其中,三条边a,b,c(数据类型为double类型)为三角形的属性,该类封装有求三角形的面积和周长的方法。分别针对三条边为3、4、5和7、8、9的两个三角形进行测试&…...
css文本溢出省略号多行单行例子详细
在 CSS 中,可以使用 text-overflow: ellipsis; 属性来实现文本溢出时自动省略号的效果。但是该属性只能用于单行文本溢出的情况,对于多行文本溢出的情况,需要使用一定的技巧才能实现相应的效果。下面将分别介绍单行和多行文本溢出时的实现方法…...
android auto
测试面向汽车的 Android 应用 | Android 开发者 | Android Developers (google.cn)...