cmake 05 使用库

news2025/4/10 18:28:30

本文目标

  1. 使用自己写的动态库
  2. 使用第三方库
  3. 更新 cm

使用自己的动态库

写一个简单的库

目录结构

F:\2023\code\cmake\calc>tree /f
卷 dox 的文件夹 PATH 列表
卷序列号为 34D2-6BE8
F:.
│  CMakeLists.txt
│
├─include
│  └─calc
│          calc.h
│
└─src
        calc.cpp
        CMakeLists.txt


F:\2023\code\cmake\calc>

源码

include/calc/calc.h

#ifndef  _CALC_H_
#define  _CALC_H_

class Calc
{
public:
    Calc();
    ~Calc();
    int add(int a, int b);
};

#endif // _CALC_H_

src/calc.cpp

#include "calc/calc.h"

Calc::Calc()
{

}

Calc::~Calc()
{

}

int Calc::add(int a, int b)
{
    return a + b;
}

CMakeLists.txt

CMakeLists.txt

cmake_minimum_required(VERSION 3.0)

project(calc CXX)

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED True)

add_subdirectory(src)

src/CMakeLists.txt

include_directories(${PROJECT_SOURCE_DIR}/include)

aux_source_directory(. CALC_SRCS)

set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)

add_library(${PROJECT_NAME} SHARED ${CALC_SRCS})

set_target_properties(${PROJECT_NAME} PROPERTIES VERSION 1.0 SOVERSION 1)

生成动态库

F:\2023\code\cmake\calc>cmake -S . -G "Unix Makefiles" -B build && cmake --build build
-- The CXX compiler identification is GNU 10.3.0
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: D:/program/tdmgcc/bin/g++.exe - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: F:/2023/code/cmake/calc/build
[ 50%] Building CXX object src/CMakeFiles/calc.dir/calc.cpp.obj
[100%] Linking CXX shared library F:/2023/code/cmake/calc/lib/libcalc.dll
[100%] Built target calc

F:\2023\code\cmake\calc>dir
 驱动器 F 中的卷是 dox
 卷的序列号是 34D2-6BE8

 F:\2023\code\cmake\calc 的目录

2023/01/25  03:03    <DIR>          .
2023/01/25  03:03    <DIR>          ..
2023/01/25  03:03    <DIR>          build
2023/01/25  02:57               150 CMakeLists.txt
2023/01/25  02:57    <DIR>          include
2023/01/25  03:03    <DIR>          lib
2023/01/25  02:58    <DIR>          src
               1 个文件            150 字节
               6 个目录 91,635,671,040 可用字节

F:\2023\code\cmake\calc>cd lib

F:\2023\code\cmake\calc\lib>dir
 驱动器 F 中的卷是 dox
 卷的序列号是 34D2-6BE8

 F:\2023\code\cmake\calc\lib 的目录

2023/01/25  03:03    <DIR>          .
2023/01/25  03:03    <DIR>          ..
2023/01/25  03:03            99,384 libcalc.dll
2023/01/25  03:03             3,844 libcalc.dll.a
               2 个文件        103,228 字节
               2 个目录 91,635,671,040 可用字节

F:\2023\code\cmake\calc\lib>

硬编码的方式使用

c++

#include <iostream>
#include <memory>

#include "calc/calc.h"

int main()
{
    auto calc = std::make_unique<Calc>();
    std::cout << "1 + 2 = " << calc->add(1,2) << std::endl;
    std::cout << "hello world" << std::endl;
    return 0;
}

CMakeLists.txt

# 该项目所需 cmake 的最小版本, 如果 cmake 版本小于设置的版本,  cmake 将停止处理并报错
cmake_minimum_required(VERSION 3.0)

project(hello_cmake CXX)
set(CMAKE_BUILD_TYPE DEBUG)

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED True)

# 检查是否定义了环境变量
if(NOT DEFINED ENV{calc_root})
    message(FATAL_ERROR "not defined environment variable:calc_root")
endif()

# calc 根目录
set(calc_root_dir $ENV{calc_root})
# calc 库目录
set(calc_lib_dir ${calc_root_dir}/lib)
# calc 头文件目录
set(calc_include_dir ${calc_root_dir}/include)
# 连接库的头文件
include_directories(${calc_include_dir})
# 指定链接库目录
link_directories(${calc_lib_dir})
# 库名称
set(lib_calc_name calc)
# 库文件完整名称 windows 为 libcalc.dll , linux 为 libcalc.so
set(lib_calc_full_name ${CMAKE_SHARED_LIBRARY_PREFIX}calc${CMAKE_SHARED_LIBRARY_SUFFIX})

aux_source_directory(. MAIN_SRCS)
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
add_executable(${PROJECT_NAME} ${MAIN_SRCS})

# 链接库文件
target_link_libraries(${PROJECT_NAME} ${lib_calc_name})
# 复制库文件, 
# 只有 windows 下需要, 当然如果把 calc.dll 复制到系统目录倒也不用复制
if(${CMAKE_HOST_WIN32})
    add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
        COMMAND ${CMAKE_COMMAND} -E copy ${calc_lib_dir}/${lib_calc_full_name} ${PROJECT_SOURCE_DIR}/bin/${lib_calc_full_name})
endif()

windows 验证

F:\2023\code\cmake\hello_cmake>set calc_root=

F:\2023\code\cmake\hello_cmake>cmake -S . -G "Unix Makefiles" -B build && cmake --build build
CMake Error at CMakeLists.txt:12 (message):
  not defined environment variable:calc_root


-- Configuring incomplete, errors occurred!
See also "F:/2023/code/cmake/hello_cmake/build/CMakeFiles/CMakeOutput.log".

F:\2023\code\cmake\hello_cmake>set calc_root=F:/2023/code/cmake/calc

F:\2023\code\cmake\hello_cmake>cmake -S . -G "Unix Makefiles" -B build && cmake --build build
-- Configuring done
-- Generating done
-- Build files have been written to: F:/2023/code/cmake/hello_cmake/build
[100%] Built target hello_cmake

F:\2023\code\cmake\hello_cmake>dir bin
 驱动器 F 中的卷是 dox
 卷的序列号是 34D2-6BE8

 F:\2023\code\cmake\hello_cmake\bin 的目录

2023/01/25  04:08    <DIR>          .
2023/01/25  04:08    <DIR>          ..
2023/01/25  04:08         2,929,130 hello_cmake.exe
2023/01/25  04:08            99,384 libcalc.dll
               2 个文件      3,028,514 字节
               2 个目录 91,583,438,848 可用字节

F:\2023\code\cmake\hello_cmake>.\bin\hello_cmake.exe
1 + 2 = 3
hello world

F:\2023\code\cmake\hello_cmake>

linux 验证

ubuntu@ubuntu-cpp:~/code/cmake/hello_cmake$ unset calc_root
ubuntu@ubuntu-cpp:~/code/cmake/hello_cmake$ cmake -S . -B build && cmake --build build
CMake Error at CMakeLists.txt:12 (message):
  not defined environment variable:calc_root


-- Configuring incomplete, errors occurred!
See also "/home/ubuntu/code/cmake/hello_cmake/build/CMakeFiles/CMakeOutput.log".
ubuntu@ubuntu-cpp:~/code/cmake/hello_cmake$ export calc_root=/home/ubuntu/code/cmake/calc
ubuntu@ubuntu-cpp:~/code/cmake/hello_cmake$ cmake -S . -B build && cmake --build build
-- Configuring done
-- Generating done
-- Build files have been written to: /home/ubuntu/code/cmake/hello_cmake/build
[ 50%] Building CXX object CMakeFiles/hello_cmake.dir/main.cpp.o
[100%] Linking CXX executable /home/ubuntu/code/cmake/hello_cmake/bin/hello_cmake
[100%] Built target hello_cmake
ubuntu@ubuntu-cpp:~/code/cmake/hello_cmake$ ll bin
total 68
drwxrwxr-x 2 ubuntu ubuntu  4096 Jan 25 04:24 ./
drwxrwxr-x 4 ubuntu ubuntu  4096 Jan 25 04:24 ../
-rwxrwxr-x 1 ubuntu ubuntu 58440 Jan 25 04:24 hello_cmake*
ubuntu@ubuntu-cpp:~/code/cmake/hello_cmake$ ./bin/hello_cmake 
1 + 2 = 3
hello world
ubuntu@ubuntu-cpp:~/code/cmake/hello_cmake$ 

find_package 的方式

其实上面的硬编码只是硬编码了 calc_root 这个变量, cmake 脚本在 windows 和 linux 已经是通用的了, 而且使用的时候有检查环境变量. 但是如果有好多个库要使用, 那么上面的方式就不太适用了. 此时可以用 find_package 来解决此问题
推荐参考:
cmake(三十二)Cmake之find_package指令
cmake(7):find_package命令详解
cmake教程4(find_package使用)

目录结构

ubuntu@ubuntu-cpp:~/code/cmake/hello_cmake$ tree -a
.
├── CMakeLists.txt
├── cmake
│   └── FindCALC.cmake
└── main.cpp

1 directory, 3 files
ubuntu@ubuntu-cpp:~/code/cmake/hello_cmake$ 

CMakeLists.txt

CMakeLists.txt

# 该项目所需 cmake 的最小版本, 如果 cmake 版本小于设置的版本,  cmake 将停止处理并报错
cmake_minimum_required(VERSION 3.25)

project(hello_cmake CXX)
set(CMAKE_BUILD_TYPE DEBUG)

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED True)


# 设置模块搜索目录
set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)


aux_source_directory(. MAIN_SRCS)
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
add_executable(${PROJECT_NAME} ${MAIN_SRCS})

# 如果有  Policy CMP0074 is not set: find_package uses <PackageName>_ROOT variables. 警告
# 则参考: https://blog.csdn.net/yzlh2009/article/details/116428378 解决, 本文直接提升 cmake_minimum_required 为当前版本
set(calc_root $ENV{calc_root})

# 查找 calc 库
find_package(CALC MODULE REQUIRED)
if(CALC_FOUND)
    include_directories(${calc_include_dir})
    target_link_libraries(${PROJECT_NAME} ${calc_library})
endif()

# 复制库文件, 
# 只有 windows 下需要, 当然如果把 calc.dll 复制到系统目录倒也不用复制
if(${CMAKE_HOST_WIN32})
    add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
        COMMAND ${CMAKE_COMMAND} -E copy ${calc_lib_dir}/${lib_calc_full_name} ${PROJECT_SOURCE_DIR}/bin/${lib_calc_full_name})
endif()

cmake/FindCALC.cmake

注意: FindCALC.cmake 规则为 FindPackageName.cmake , 其中 PackageName 为全大写

# calc 根目录
set(calc_root_dir ${calc_root})
set(calc_include_dir ${calc_root_dir}/include)
set(calc_lib_dir ${calc_root_dir}/lib)


message(STATUS "info - calc_root_dir : ${calc_root_dir}")
message(STATUS "info - calc_include_dir : ${calc_include_dir}")
message(STATUS "info - calc_lib_dir : ${calc_lib_dir}")

# 指定链接库目录
link_directories(${calc_lib_dir})
# 库名称
set(lib_calc_name calc)
# 库文件完整名称 windows 为 libcalc.dll , linux 为 libcalc.so
set(lib_calc_full_name ${CMAKE_SHARED_LIBRARY_PREFIX}calc${CMAKE_SHARED_LIBRARY_SUFFIX})

message(STATUS "info - lib_calc_name : ${lib_calc_name}")
message(STATUS "info - lib_calc_full_name : ${lib_calc_full_name}")

# 查找头文件
find_path(calc_include_dir calc.h PATHS "${calc_include_dir}")
# 查找库文件
find_library(calc_library calc PATHS "${calc_lib_dir}")

message(STATUS "info - calc_include_dir : ${calc_include_dir}")
message(STATUS "info - calc_library : ${calc_library}")

# 如果找到
if(calc_include_dir AND calc_library)
    set(CALC_FOUND TRUE)
    message(STATUS "Found calc: ${calc_library}")
endif()

# 如果没有找到, 并且 calc 为必须依赖项
if(NOT CALC_FOUND AND CALC_FIND_REQUIRED)
    message(FATAL_ERROR "Coluld not find calc")
endif()

验证

linux 大同小异, 不再展示

F:\2023\code\cmake\hello_cmake>cmake -S . -G "Unix Makefiles" -B build && cmake --build build
-- The CXX compiler identification is GNU 10.3.0
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: D:/program/tdmgcc/bin/g++.exe - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- info - calc_root_dir : F:/2023/code/cmake/calc
-- info - calc_include_dir : F:/2023/code/cmake/calc/include
-- info - calc_lib_dir : F:/2023/code/cmake/calc/lib
-- info - lib_calc_name : calc
-- info - lib_calc_full_name : libcalc.dll
-- info - calc_include_dir : F:/2023/code/cmake/calc/include
-- info - calc_library : F:/2023/code/cmake/calc/lib/libcalc.dll.a
-- Found calc: F:/2023/code/cmake/calc/lib/libcalc.dll.a
-- Configuring done
-- Generating done
-- Build files have been written to: F:/2023/code/cmake/hello_cmake/build
[ 50%] Building CXX object CMakeFiles/hello_cmake.dir/main.cpp.obj
[100%] Linking CXX executable F:/2023/code/cmake/hello_cmake/bin/hello_cmake.exe
[100%] Built target hello_cmake

F:\2023\code\cmake\hello_cmake>dir bin
 驱动器 F 中的卷是 dox
 卷的序列号是 34D2-6BE8

 F:\2023\code\cmake\hello_cmake\bin 的目录

2023/01/25  05:49    <DIR>          .
2023/01/25  05:49    <DIR>          ..
2023/01/25  05:49         2,929,130 hello_cmake.exe
2023/01/25  05:49            99,384 libcalc.dll
               2 个文件      3,028,514 字节
               2 个目录 91,582,947,328 可用字节

F:\2023\code\cmake\hello_cmake>.\bin\hello_cmake.exe
1 + 2 = 3
hello world

F:\2023\code\cmake\hello_cmake>

上述操作有什么问题

  1. calc 库的头文件应当合并成1个, 这样引入的时候不用写那么多的 include
  2. 复制库文件部分应当写成一个函数, 这样调用方直接调用这个函数就好了
  3. 只验证了 tdm-gcc(windows) 和 g++(linux), 未验证 msvc
  4. 没有区分 debug 和 release

修正 find_package 脚本

  1. 修正自定义库头文件布局
  2. 添加两个库, 一个为必须依赖, 一个为可选依赖
  3. 添加复制库文件的函数
  4. 验证 msvc (windows) , tdm-gcc (windows) , g++ (linux)

第一个自定义库

此为必选依赖

第二个自定义库

此为可选依赖

主程序

tdm-gcc (windows) 验证

msvc (windows) 验证

g++ (linux) 验证

使用 wxWidgets 写一个 Hello World

首要目标是在 linux 和 windows 上运行起来

代码

https://docs.wxwidgets.org/3.2/overview_helloworld.html

// wxWidgets "Hello World" Program
 
// For compilers that support precompilation, includes "wx/wx.h".
#include <wx/wxprec.h>
 
#ifndef WX_PRECOMP
    #include <wx/wx.h>
#endif
 
class MyApp : public wxApp
{
public:
    virtual bool OnInit();
};
 
class MyFrame : public wxFrame
{
public:
    MyFrame();
 
private:
    void OnHello(wxCommandEvent& event);
    void OnExit(wxCommandEvent& event);
    void OnAbout(wxCommandEvent& event);
};
 
enum
{
    ID_Hello = 1
};
 
wxIMPLEMENT_APP(MyApp);
 
bool MyApp::OnInit()
{
    MyFrame *frame = new MyFrame();
    frame->Show(true);
    return true;
}
 
MyFrame::MyFrame()
    : wxFrame(NULL, wxID_ANY, "Hello World")
{
    wxMenu *menuFile = new wxMenu;
    menuFile->Append(ID_Hello, "&Hello...\tCtrl-H",
                     "Help string shown in status bar for this menu item");
    menuFile->AppendSeparator();
    menuFile->Append(wxID_EXIT);
 
    wxMenu *menuHelp = new wxMenu;
    menuHelp->Append(wxID_ABOUT);
 
    wxMenuBar *menuBar = new wxMenuBar;
    menuBar->Append(menuFile, "&File");
    menuBar->Append(menuHelp, "&Help");
 
    SetMenuBar( menuBar );
 
    CreateStatusBar();
    SetStatusText("Welcome to wxWidgets!");
 
    Bind(wxEVT_MENU, &MyFrame::OnHello, this, ID_Hello);
    Bind(wxEVT_MENU, &MyFrame::OnAbout, this, wxID_ABOUT);
    Bind(wxEVT_MENU, &MyFrame::OnExit, this, wxID_EXIT);
}
 
void MyFrame::OnExit(wxCommandEvent& event)
{
    Close(true);
}
 
void MyFrame::OnAbout(wxCommandEvent& event)
{
    wxMessageBox("This is a wxWidgets Hello World example",
                 "About Hello World", wxOK | wxICON_INFORMATION);
}
 
void MyFrame::OnHello(wxCommandEvent& event)
{
    wxLogMessage("Hello world from wxWidgets!");
}

linux 版

安装

sudo apt-get install pkg-config
sudo apt install libgtk-3-dev

然后直接安装即可

./configure && make && sudo make install

hello world

编译

ubuntu@ubuntu-cpp:~/code/cmake/wx_test$ ll
total 164
drwxrwxr-x 2 ubuntu ubuntu   4096 Jan 25 02:33 ./
drwxrwxr-x 3 ubuntu ubuntu   4096 Jan 25 02:27 ../
-rwxrwxr-x 1 ubuntu ubuntu 155328 Jan 25 02:33 hello*
-rw-rw-r-- 1 ubuntu ubuntu   1707 Jan 25 02:27 main.cpp
ubuntu@ubuntu-cpp:~/code/cmake/wx_test$ 

运行起来的效果

在这里插入图片描述

windows 版

在 Windows 上的环境搭建也很简单, 参考:
vs2019配置wxwidgets3.1.6教程
VS2019配置wxWidgets v3.1.6开发环境(超详细)
【配置】VS2015下wxWidgets 3.1.1开发环境

上述几篇博客已经写的很好, 不再赘述

cm 工具应当更新什么内容

需要添加

  1. 添加 clean 子命令
  2. 添加 --add-module 子命令
  3. 修正帮助文档的输出

待实现

  1. 全局配置和当前项目配置. 思路: 全局配置放在安装目录的 config 文件, 当前项目配置放在 .cm/config
  2. 命令别名. 思路: 命令别名放在 .cm/config
  3. 语言标准检测 思路: 提前准备几个特定的程序, 针对不同的标准进行验证
  4. 与第三方库整合
  5. doxygen 命令
  6. test 命令

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

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

相关文章

2022除夕卖水果

急促的呼吸&#xff0c;急促的爱&#xff0c;急促的吆喝声 来吧 朋友 伸出你的手 还有十分钟&#xff0c;拆拆盒子收摊中 管尝管饱&#xff0c;礼盒散装可打包 红橙黄绿青蓝紫 苹果樱桃小番茄 柠檬枳柑桔橙柚 香蕉龙眼与柠檬 蜜瓜西瓜猕猴桃 提子樱桃火龙果 葡萄甘蔗车厘子 柿子…

ES常用知识点整理第一部分

ES常用知识点整理第一部分引言APICrud APIBulk API批量读取批量查询ES服务器常见错误返回倒排索引分词器中文分词器Search APIURI SearchQuery DSL查询表达式短语搜索Query String 和 Simple Query Stringmapping映射动态映射手动映射多字段特性自定义分词Index TemplateDynami…

【Ubuntu】Nacos 2.1 单机安装

目录Nacos 2.1 单机安装1. 从GitHub下载2.1.0的压缩包2. 解压与配置3. 数据库配置4. 单机启动nacos遇到的一些错误ErrMsg:jmenv.tbsite.netlibstdc.so.6: cannot open shared object file: No such file or directoryCaused by: java.lang.IllegalStateException: No DataSourc…

3DCAD图纸转2D(DXF)图纸通用解决方案文稿

3DCAD图纸转2D(DXF)图纸通用解决方案文稿 本文地址&#xff1a;https://gitee.com/dvaloveu/lovedva/issues/I6B5YC 视频演示(1.25倍速&原速)&#xff1a;Acfun Bilibili 脚本地址&#xff1a;https://gitee.com/dvaloveu/ug-automation/blob/master/ug2caxa/hellowolrd.p…

第二章物理层-第五节:信道的极限容量

文章目录一&#xff1a;相关概念&#xff08;1&#xff09;失真&#xff08;2&#xff09;信道带宽W&#xff08;3&#xff09;波特率&#xff08;Baud&#xff09;二&#xff1a;奈奎斯特定理&#xff08;奈氏准则&#xff09;三&#xff1a;香农定理本节对应视频 【计算机网络…

sql注入绕过(持续更新)

判断存在注入 ab|| 查询表名 select{x table_name}from information_schema.tables where table_schemadatabase# () SQL 中的 substring 函数是用来抓出一个栏位资料中的其中一部分。这个函数的名称在不同的资料库中不完全一样&#xff1a; MySQL: SUBSTR( ), SUBSTRING(…

Coolify系列01- 从0到1超详细手把手教你上手Heroku 和 Netlify 的开源替代方案

什么是Coolify 一款超强大的开源自托管 Heroku / Netlify 替代方案coolLabs是开源、自托管和以隐私为中心的应用程序和服务的统称 为什么使用Coolify 只需单击几下即可托管你的应用、数据库或其他开源服务&#xff0c;等。它是 Heroku 和 Netlify 的一个替代方案。通过 Cool…

springbootWeb常用注解使用

springbootWeb常用注解使用PathVariable 路径变量注解RequestHeader 请求标头注解RequestParam 请求域注解RequestBody 请求体注解ModelAttribute使用1,将其置于方法上&#xff1a;使用2&#xff0c;将其置于方法参数上&#xff1a;CookieValuePathVariable 路径变量注解 可以…

3.4动态规划--最大字段和

要好好学习这个难受难受超级难受的动态规划了&#xff0c;千万不要再沉迷在看剧和玩耍里面了。必须承认最近没有好好学习。 写在前面 最大字段和书上介绍了三种解法&#xff1a;暴力、递归分治、动态规划 递归分治&#xff0c;一分为二&#xff0c;合并的时候有三种情况&…

java容器轻松理解 collection collections(异同篇)

(1)collectionset &#xff08;只能迭代&#xff0c;不可以按下标取值&#xff09;hashset、Treesetlist&#xff08;可以迭代&#xff0c;也可以按下标取值&#xff09;ArrayList、LinkedList、Vector特点&#xff1a;ArrayList:方便随机访问&#xff0c;由数组实现的。所以中…

十大经典排序算法(动态演示+代码)-选择排序与插入排序

选择排序 一、什么是选择排序&#xff1f; 选择排序&#xff08;Selection sort&#xff09;是一种简单直观的排序算法。它的工作原理是&#xff1a;第一次从待排序的中数据元素选出最小&#xff08;或最大&#xff09;的一个元素&#xff0c;存放在序列的起始位置&#xff0c…

行为型模式-策略模式

1.概述 先看下面的图片&#xff0c;我们去旅游选择出行模式有很多种&#xff0c;可以骑自行车、可以坐汽车、可以坐火车、可以坐飞机。 作为一个程序猿&#xff0c;开发需要选择一款开发工具&#xff0c;当然可以进行代码开发的工具有很多&#xff0c;可以选择Idea进行开发&a…

04_iic子系统

总结 iic_client和iic_driver 加入iic总线的思想和paltform总线的玩法一样 把iic设备和驱动注册到iic总线中 构造出字符设备驱动和设备节点供app进行操作 但是iic硬件设备是挂在iic控制器下面的 所以iic控制器也会有自己的驱动和设备树节点 厂家一般都会帮做好 我们写的iic_dr…

离散系统的数字PID控制仿真-2

设计离散PID控制器&#xff0c;各信号的跟踪结果如图所示&#xff0c;其中S代表输入指令信号的类型。通过取余指令 mod实现三角波和锯齿波。当S1时为三角波&#xff0c;S2时为锯齿波&#xff0c;S3时为随机信号。在仿真过程中&#xff0c;如果 D1&#xff0c;则通过 pause命令实…

Prometheus学习整理-Prometheus-operator

Prometheus中的promQL语句: Prometheus提供的一种promQL语法,用来处理接口数据,然后方便用户对数据进行处理加工,它是Prometheus专门提供的一个函数表达式语言,可以实时的查询和聚合时间序列的数据,通过HTTPApi的方式提供给外部使用,PromQL主要分为下面的几种类型数据: 这里面的…

【老卫搞机】136期:华为开发者联盟社区2022年度战码先锋2期开源贡献之星

首先祝大家兔年大吉&#xff0c;身体安康&#xff0c;钱兔似锦&#xff01;接上次的“2022年牛人之星”&#xff08; https://developer.huawei.com/consumer/cn/forum/topic/0203109930647268095&#xff09;&#xff0c;今天咱们来开箱另外一件特殊的奖品&#xff0c;来自华为…

MySQL内外连接

文章目录MySQL内外连接内连接外连接左外连接右外连接简单案例MySQL内外连接 表的连接分为内连接和外连接。 内连接 内连接 内连接的SQL如下&#xff1a; SELECT ... FROM t1 INNER JOIN t2 ON 连接条件 [INNER JOIN t3 ON 连接条件] ... AND 其他条件;说明一下&#xff1a; …

零基础学JavaWeb开发(二十三)之 springmvc入门到精通(3)

5、springspringmvcmybatis整合 5.1、项目技术需求分析 1.使用ssmlayui技术开发 对用户表数据实现增删改查 采用前后端分离架构模式 5.2、SSM环境的整合之提供增删改查 整合数据库表结构 CREATE TABLE mayikt_users (id int NOT NULL AUTO_INCREMENT,name varchar(255) CH…

Mysql入门技能树-使用数据库

创建和删除数据库 Joe 在开发机上创建了一个名为 goods 的数据库&#xff0c;做了一些练习&#xff0c;现在他需要删除这个数据库&#xff0c;重建一个 goods。那么他需要的步骤是&#xff1a; 答案是&#xff1a;A 创建数据库的语法格式如下&#xff1a; CREATE DATABASE d…

client-go实战之九:手写一个kubernetes的controller

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码)&#xff1a;https://github.com/zq2599/blog_demos 系列文章链接 client-go实战之一&#xff1a;准备工作client-go实战之二:RESTClientclient-go实战之三&#xff1a;Clientsetclient-go实战之四&#xff1a;…