Cmake的详细使用

CSDN复制进来的mk笔记很乱 可以看下面的pdf文档 比较清晰
https://download.csdn.net/download/qq_41537499/89512254

Cmake
apt install cmake
cmake --version
cmake version 3.22.1

vim main.cpp
main.cpp 代码:
#include
int main(int argc,char *argv[])
{
std::cout << “hello, world” << std::endl;
return(0);
}

#一般的单文件执行用g++
g++ main.cpp -o app
//生成了一个可执行的文件app
-rwxr-xr-x 1 root root 16528 7月 2 18:19 app*

执行这个文件

./app 输出:hello, world

换成Cmake执行
touch CMakeLists.txt
vim CMakeLists.txt

CMakeLists.txt 内容:
cmake_minimum_required(VERSION 3.15)
project(test)
add_executable(app main.cpp)

执行Cmake 此时的main.cpp与CMakeLists.txt在同一级目录 用 .
root@zyp:/opt/test_bazel/examples/cpp-tutorial/stage1# cmake .
– Configuring done
– Generating done
– Build files have been written to: /opt/test_bazel/examples/cpp-tutorial/stage1

执行完命令多了CMakeCache.txt、cmake_install.cmake、Makefile文件以及 CMakeFiles文件夹

然后我们创建一个build文件夹,存放Cmake生成的文件
cd build
cmake … #当前在build下 、main.cpp在上级 所以用cmake…

– The C compiler identification is GNU 11.4.0
– The CXX compiler identification is GNU 11.4.0
– Detecting C compiler ABI info
– Detecting C compiler ABI info - done
– Check for working C compiler: /usr/bin/cc - skipped
– Detecting C compile features
– Detecting C compile features - done
– Detecting CXX compiler ABI info
– Detecting CXX compiler ABI info - done
– Check for working CXX compiler: /usr/bin/c++ - skipped
– Detecting CXX compile features
– Detecting CXX compile features - done
– Configuring done
– Generating done
– Build files have been written to: /opt/test_bazel/examples/cpp-tutorial/stage1/build
查看当前build下生成的目录结构
├── CMakeCache.txt
├── CMakeFiles
│ ├── 3.22.1
│ │ ├── CMakeCCompiler.cmake
│ │ ├── CMakeCXXCompiler.cmake
│ │ ├── CMakeDetermineCompilerABI_C.bin
│ │ ├── CMakeDetermineCompilerABI_CXX.bin
│ │ ├── CMakeSystem.cmake
│ │ ├── CompilerIdC
│ │ │ ├── a.out
│ │ │ ├── CMakeCCompilerId.c
│ │ │ └── tmp
│ │ └── CompilerIdCXX
│ │ ├── a.out
│ │ ├── CMakeCXXCompilerId.cpp
│ │ └── tmp
│ ├── app.dir
│ │ ├── build.make
│ │ ├── cmake_clean.cmake
│ │ ├── compiler_depend.make
│ │ ├── compiler_depend.ts
│ │ ├── DependInfo.cmake
│ │ ├── depend.make
│ │ ├── flags.make
│ │ ├── link.txt
│ │ └── progress.make
│ ├── cmake.check_cache
│ ├── CMakeDirectoryInformation.cmake
│ ├── CMakeOutput.log
│ ├── CMakeTmp
│ ├── Makefile2
│ ├── Makefile.cmake
│ ├── progress.marks
│ └── TargetDirectories.txt
├── cmake_install.cmake
└── Makefile

利用MakeFile文件生成可执行文件app
root@zyp:/opt/test_bazel/examples/cpp-tutorial/stage1/build# make
[ 50%] Building CXX object CMakeFiles/app.dir/main.cpp.o
[100%] Linking CXX executable app
[100%] Built target app
root@zyp:/opt/test_bazel/examples/cpp-tutorial/stage1/build# ./app
hello, world
set使用
CMakeLists.tst

cmake_minimum_required(VERSION 3.15)
project(test)
set(SRC main.cpp) #SRC是定义的一个变量
set(EXECUTABLE_OUTPUT_PATH /opt/test_Cmake/build) #设置一个生成的可执行程序的输出目录,没有这个文件夹会自动生成
set(CMAKE_CXX_STANDARD 11) #设置c++标准 是11
add_executable(app ${SRC})

root@zyp:/opt/test_bazel/examples/cpp-tutorial/stage1/build# cmake …
– Configuring done
– Generating done
– Build files have been written to: /opt/test_bazel/examples/cpp-tutorial/stage1/build
root@zyp:/opt/test_bazel/examples/cpp-tutorial/stage1/build# ll
总计 40
drwxr-xr-x 3 root root 4096 7月 3 11:20 ./
drwxr-xr-x 4 root root 4096 7月 3 11:20 …/
-rw-r–r-- 1 root root 13847 7月 3 11:19 CMakeCache.txt
drwxr-xr-x 5 root root 4096 7月 3 11:20 CMakeFiles/
-rw-r–r-- 1 root root 1664 7月 3 11:20 cmake_install.cmake
-rw-r–r-- 1 root root 5158 7月 3 11:20 Makefile
查看我们定义的输出目录 没有执行make之前是没有文件的
root@zyp:/opt/test_Cmake/build# ll
drwxr-xr-x 2 root root 4096 7月 3 11:20 ./
drwxr-xr-x 3 root root 4096 7月 3 11:20 …/
执行make
root@zyp:/opt/test_bazel/examples/cpp-tutorial/stage1/build# make
[ 50%] Building CXX object CMakeFiles/app.dir/main.cpp.o
[100%] Linking CXX executable /opt/test_Cmake/build/app
[100%] Built target app

发现在我们自定义文件夹下/opt/test_Cmake/build下生成了可执行程序app
root@zyp:/opt/test_Cmake/build# ls
app
root@zyp:/opt/test_Cmake/build# ./app
hello, world
CMakeLists.txt中主要的几个宏
aux_source_directory、CMAKE_CURRENT_SOURCE_DIR、PROJECT_SOURCE_DIR、file
CMAKE_CURRENT_SOURCE_DIR和PROJECT_SOURCE_DIR区别
CMAKE_CURRENT_SOURCE_DIR:当前正在处理的CMakeLists.txt所在的源代码目录路径,它的值会随着CMake在不同目录下处理CMakeLists.txt文件而变化
CMAKE_CURRENT_SOURCE_DIRPROJECT_SOURCE_DIR是CMake构建系统中的两个常用变量,它们在定义、位置变化以及用途**等方面存在差异。具体分析如下:
定义
CMAKE_CURRENT_SOURCE_DIR:这是当前正在处理的CMakeLists.txt所在的源代码目录路径。它的值会随着CMake在不同目录下处理CMakeLists.txt文件而变化。
PROJECT_SOURCE_DIR:这个变量指向包含最近一次调用project()命令的CMakeLists.txt文件的目录。在多项目情况下,每个子项目(每次调用project()命令)都会重新设置PROJECT_SOURCE_DIR
位置变化
CMAKE_CURRENT_SOURCE_DIR:由于它指向当前处理的CMakeLists.txt所在目录,因此其值会在CMake处理不同目录下的文件时改变[4]。
PROJECT_SOURCE_DIR:相对固定,只有在新的project()命令被执行时才会更新其值,指向该命令所在目录。
用途
CMAKE_CURRENT_SOURCE_DIR:当需要引用同级或子级目录下的文件时,应该使用CMAKE_CURRENT_SOURCE_DIR[4]。它常用于指定当前目录下的资源文件或配置文件。
PROJECT_SOURCE_DIR:适用于多项目结构,每个子项目可以有自己的PROJECT_SOURCE_DIR,使得每个子项目有独立的源代码目录路径。
综合对比分析,针对实际的项目结构和需求,以下是一些建议:

  • 对于单一目录的项目,通常不需要频繁使用PROJECT_SOURCE_DIRCMAKE_SOURCE_DIR已足够。
  • 在多层次、多项目结构中,合理使用PROJECT_SOURCE_DIR可以带来更好的灵活性和项目管理能力。
  • 当在脚本中定义相对路径时,使用CMAKE_CURRENT_SOURCE_DIR能确保正确解析这些路径。
  • 使用变量时,了解其作用域和适用场景可以避免常见错误,提升构建配置的可维护性。

总的来说,CMAKE_CURRENT_SOURCE_DIR主要用于动态指示当前处理的源目录,而PROJECT_SOURCE_DIR则用于指示最接近的project()命令所在的目录,这在多项目和多层级项目中特别有用。正确使用这两个变量,可以帮助开发者更好地控制项目的构建过程和结构。
PROJECT_SOURCE_DIR、aux_source_directory

cmake_minimum_required(VERSION 3.15)
project(test)

set(SRC main.cpp)

aux_source_directory(${PROJECT_SOURCE_DIR} SRC)
#PROJECT_SOURCE_DIR这个宏的意思是执行Cmake命令后面的路径 如.或则…后 可以理解为根目录
set(EXECUTABLE_OUTPUT_PATH /opt/test_Cmake/build) #设置一个生成的可执行程序的输出目录,没有这个文件夹会自动生成
set(CMAKE_CXX_STANDARD 11) #设置c++标准 是11
add_executable(app ${SRC})

file、CMAKE_CURRENT_SOURCE_DIR

cmake_minimum_required(VERSION 3.15)
project(test)

set(SRC main.cpp)

aux_source_directory(${PROJECT_SOURCE_DIR} SRC)

file(GLOB SRC ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp)
#CMAKE_CURRENT_SOURCE_DIR这个宏是指CMakeists.txt所在的路径
set(EXECUTABLE_OUTPUT_PATH /opt/test_Cmake/build) #设置一个生成的可执行程序的输出目录,没有这个文件夹会自动生成
set(CMAKE_CXX_STANDARD 11) #设置c++标准 是11
add_executable(app ${SRC})
头文件、源文件
假设我们有一个程序,它有一个用于计算的功能。我们可以将这个功能分成两部分组成:声明(在头文件中)和实现(在源文件中)。
目录结构
├── build
│ ├── CMakeCache.txt
│ ├── CMakeFiles
│ ├── cmake_install.cmake
│ └── Makefile
├── CMakeLists.txt
├── include
│ └── calculate.h
├── src
│ ├── calculate.cpp
│ └── main.cpp
└──
头文件.h
// calculate.h
#ifndef CALCULATE_H
#define CALCULATE_H

// 函数声明
int add(int a, int b);

#endif // CALCULATE_H
相应的实现在文件calculate.cpp中
// calculate.cpp
#include “calculate.h”

// 函数实现
int add(int a, int b) {
return a + b;
}
主程序main.cpp
// main.cpp
#include
#include “calculate.h”

int main() {
int sum = add(3, 4);
std::cout << "The sum is: " << sum << std::endl;
return 0;
}
CMakeLists.txt变化为
cmake_minimum_required(VERSION 3.15)
project(test)

set(SRC main.cpp)

aux_source_directory(${PROJECT_SOURCE_DIR} SRC)

file(GLOB SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp)
#CMAKE_CURRENT_SOURCE_DIR这个宏是指CMakeists.txt所在的路径
set(EXECUTABLE_OUTPUT_PATH /opt/test_Cmake/build)
#设置一个生成的可执行程序的输出目录,没有这个文件夹会自动生成
set(CMAKE_CXX_STANDARD 11)
#设置c++标准 是11
add_executable(app KaTeX parse error: Expected 'EOF', got '#' at position 144: …al/stage1/build#̲ make [ 33%] Bu…{CMAKE_CURRENT_SOURCE_DIR}/include)
cmake_minimum_required(VERSION 3.15)
project(test)
file(GLOB SRC C M A K E C U R R E N T S O U R C E D I R / s r c / ∗ . c p p ) s e t ( E X E C U T A B L E O U T P U T P A T H / o p t / t e s t C m a k e / b u i l d ) i n c l u d e d i r e c t o r i e s ( {CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp) set(EXECUTABLE_OUTPUT_PATH /opt/test_Cmake/build) include_directories( CMAKECURRENTSOURCEDIR/src/.cpp)set(EXECUTABLEOUTPUTPATH/opt/testCmake/build)includedirectories({CMAKE_CURRENT_SOURCE_DIR}/include)
set(CMAKE_CXX_STANDARD 11)
add_executable(app ${SRC})
编译成功
root@zyp:/opt/test_bazel/examples/cpp-tutorial/stage1/build# cmake …
– Configuring done
– Generating done
– Build files have been written to: /opt/test_bazel/examples/cpp-tutorial/stage1/build
root@zyp:/opt/test_bazel/examples/cpp-tutorial/stage1/build# make
Consolidate compiler generated dependencies of target app
[ 33%] Building CXX object CMakeFiles/app.dir/src/calculate.cpp.o
[ 66%] Building CXX object CMakeFiles/app.dir/src/main.cpp.o
[100%] Linking CXX executable /opt/test_Cmake/build/app
[100%] Built target app
root@zyp:/opt/test_Cmake/build# ./app
The sum is: 7
制作静态动态库
静态库STATIC
动态库SHARED
当前目录结构:
root@zyp:/opt/test_Cmake/lib# tree -L 2
.
├── build
│ ├── CMakeCache.txt
│ ├── CMakeFiles
│ ├── cmake_install.cmake
│ └── Makefile
├── CMakeLists.txt
├── include
│ └── calculate.h
└── src
├── calculate.cpp
└── main.cpp
动态库 SHARED
cmake_minimum_required(VERSION 3.15)
project(test)
file(GLOB SRC C M A K E C U R R E N T S O U R C E D I R / s r c / ∗ . c p p ) i n c l u d e d i r e c t o r i e s ( {CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp) include_directories( CMAKECURRENTSOURCEDIR/src/.cpp)includedirectories({CMAKE_CURRENT_SOURCE_DIR}/include)
add_library(calc SHARED ${SRC})
编译动态库
oot@zyp:/opt/test_Cmake/lib/build# cmake …
– The C compiler identification is GNU 11.4.0
– The CXX compiler identification is GNU 11.4.0
– Detecting C compiler ABI info
– Detecting C compiler ABI info - done
– Check for working C compiler: /usr/bin/cc - skipped
– Detecting C compile features
– Detecting C compile features - done
– Detecting CXX compiler ABI info
– Detecting CXX compiler ABI info - done
– Check for working CXX compiler: /usr/bin/c++ - skipped
– Detecting CXX compile features
– Detecting CXX compile features - done
– Configuring done
– Generating done
– Build files have been written to: /opt/test_Cmake/lib/build
root@zyp:/opt/test_Cmake/lib/build# make
[ 33%] Building CXX object CMakeFiles/calc.dir/src/calculate.cpp.o
[ 66%] Building CXX object CMakeFiles/calc.dir/src/main.cpp.o
[100%] Linking CXX shared library libcalc.so
[100%] Built target calc

执行make在当前目录build下面生成了一个动态库libcalc.so
root@zyp:/opt/test_Cmake/lib/build# ls
CMakeCache.txt CMakeFiles cmake_install.cmake libcalc.so Makefile
静态库 STATIC
cmake_minimum_required(VERSION 3.15)
project(test)
file(GLOB SRC C M A K E C U R R E N T S O U R C E D I R / s r c / ∗ . c p p ) i n c l u d e d i r e c t o r i e s ( {CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp) include_directories( CMAKECURRENTSOURCEDIR/src/.cpp)includedirectories({CMAKE_CURRENT_SOURCE_DIR}/include)
add_library(calc STATIC ${SRC})
编译静态库
root@zyp:/opt/test_Cmake/lib# vim CMakeLists.txt
root@zyp:/opt/test_Cmake/lib# cd build/
root@zyp:/opt/test_Cmake/lib/build# cmake …
– Configuring done
– Generating done
– Build files have been written to: /opt/test_Cmake/lib/build
root@zyp:/opt/test_Cmake/lib/build# make
Consolidate compiler generated dependencies of target calc
[ 33%] Building CXX object CMakeFiles/calc.dir/src/calculate.cpp.o
[ 66%] Building CXX object CMakeFiles/calc.dir/src/main.cpp.o
[100%] Linking CXX static library libcalc.a
[100%] Built target calc
root@zyp:/opt/test_Cmake/lib/build# ls
CMakeCache.txt CMakeFiles cmake_install.cmake libcalc.a libcalc.so Makefile
root@zyp:/opt/test_Cmake/lib/build#
执行make在当前目录build下面生成了一个静态库libcalc.a
LIBRARY_OUTPUT_PATH
指定动态或者静态库生成的文件位置
类似与 set(EXECUTABLE_OUTPUT_PATH /opt/test_Cmake/build) #设置一个生成的可执行程序的输出目录,
cmake_minimum_required(VERSION 3.15)
project(test)
file(GLOB SRC C M A K E C U R R E N T S O U R C E D I R / s r c / ∗ . c p p ) i n c l u d e d i r e c t o r i e s ( {CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp) include_directories( CMAKECURRENTSOURCEDIR/src/.cpp)includedirectories({CMAKE_CURRENT_SOURCE_DIR}/include)
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/testlib)
add_library(calc STATIC ${SRC})
编译生成
root@zyp:/opt/test_Cmake/lib/build# make
[ 33%] Building CXX object CMakeFiles/calc.dir/src/calculate.cpp.o
[ 66%] Building CXX object CMakeFiles/calc.dir/src/main.cpp.o
[100%] Linking CXX static library …/testlib/libcalc.a
[100%] Built target calc

生成的文件目录是

${PROJECT_SOURCE_DIR}/testlib

root@zyp:/opt/test_Cmake/lib# ls
build CMakeLists.txt include src testlib
调用库
创建两个目录
root@zyp:/opt/test_Cmake/lib# mkdir staticLib sharedLi
#将静态库、动态库文件复制到对应目录下
root@zyp:/opt/test_Cmake/lib/testlib# cp libcalc.a …/staticLib/
root@zyp:/opt/test_Cmake/lib/testlib# cp libcalc.so …/sharedLib/
root@zyp:/opt/test_Cmake/lib# tree -L 2
.

├── CMakeLists.txt
├── include
│ └── calculate.h
├── sharedLib
│ └── libcalc.so
├── staticLib
│ └── libcalc.a
└── testlib
├── libcalc.a
└── libcalc.so

创建一个测试文件test.cpp 调用动态库
#include
#include “calculate.h”

int main() {
int sum = add(3, 4);
std::cout << "The sum is: " << sum << std::endl;
return 0;
}

注意当前目录写的src已经删除 src下的功能实现文件calculate.cpp与主程序main.cpp都被删除了,所以
注意删除CMakeLists.txt中的file(GLOB SRC ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp)中的src
├── CMakeLists.txt
├── include
│ └── calculate.h
├── sharedLib
│ └── libcalc.so
├── staticLib
│ └── libcalc.a
├── test.cpp
└── testlib
├── libcalc.a
└── libcalc.so

此时的CMakeLists.txt :

cmake_minimum_required(VERSION 3.15)
project(test)
#追踪源文件test.app
file(GLOB SRC C M A K E C U R R E N T S O U R C E D I R / ∗ . c p p ) i n c l u d e d i r e c t o r i e s ( {CMAKE_CURRENT_SOURCE_DIR}/*.cpp) include_directories( CMAKECURRENTSOURCEDIR/.cpp)includedirectories({CMAKE_CURRENT_SOURCE_DIR}/include)
link_libraries(calc) #链接到库文件
#因为库文件不是系统的,需要指定库文件位置
link_directories(${CMAKE_CURRENT_SOURCE_DIR}/staticLib)
add_executable(app1 ${SRC})
编译
root@zyp:/opt/test_Cmake/lib/build# cmake …
– Configuring done
– Generating done
– Build files have been written to: /opt/test_Cmake/lib/build

root@zyp:/opt/test_Cmake/lib/build# make
[ 50%] Building CXX object CMakeFiles/app1.dir/test.cpp.o
[100%] Linking CXX executable app1
[100%] Built target app1

#生成了可执行文件app1
root@zyp:/opt/test_Cmake/lib/build# ls
app1 CMakeCache.txt CMakeFiles cmake_install.cmake Makefile
root@zyp:/opt/test_Cmake/lib/build# ./app1
The sum is: 7

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

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

相关文章

知识图谱知识点总结

知识图谱知识点总结 1. 知识图谱的定义 知识图谱&#xff08;Knowledge Graph&#xff09;是用于描述现实世界中的实体及其关系的图结构&#xff0c;广泛应用于信息检索、自然语言处理、推荐系统等领域。 2. 知识图谱的组成部分 实体&#xff08;Entity&#xff09;: 现实世…

【高中数学/基本不等式】已知:x,y皆大于1,且x+2y=4 求:1/(x-1)+1/(y-1)的最小值为?

【问题来源】 https://www.ixigua.com/7025123539728466469?logTag1c2fd2e305d60e6277ab 之第一题 【问题】 已知&#xff1a;x,y皆大于1&#xff0c;且x2y4 求&#xff1a;1/(x-1)1/(y-1)的最小值为&#xff1f; 【解答】 解&#xff1a; 若将(x2y)/41代入目标式&…

学习笔记(linux高级编程)11

进程间通信 》信号通信 应用&#xff1a;异步通信。 中断&#xff0c;&#xff0c; 1~64&#xff1b;32应用编程。 如何响应&#xff1a; Term Default action is to terminate the process. Ign Default action is to ignore the signal. wait Core Default action is …

模板类内部能否含有虚函数?

首先&#xff0c;我们要区分模板类虚函数和模板虚函数&#xff0c;话不多说&#xff0c;先上代码&#xff1a; 模板类虚函数 template<class T> class A{ public:virtual ~A(){}virtual void foo(T &t){} };template<class T, class R> class B : public A<…

第一性原理

第一性原理是一个具有深厚哲学根基并广泛应用于多个领域的概念。以下是对其的详细解析&#xff1a; 一、定义 第一性原理&#xff08;the First Principle Thinking&#xff09;指的是从基本要素出发&#xff0c;不依赖于任何假设或经验&#xff0c;通过逻辑推理一步步建立起…

面向对象编程进阶笔记

一、代码重用与继承 在面向对象编程中&#xff0c;代码重用是一个核心概念&#xff0c;通过继承机制可以实现这一点。继承允许子类自动获得父类的所有方法和属性&#xff0c;无需重复编写相同的代码。子类在继承父类的基础上&#xff0c;可以添加自己特有的属性和方法&#xf…

番外篇 | 斯坦福提出即插即用二阶优化器Sophia :相比Adam实现2倍加速,显著节省大语言模型训练成本

前言:Hello大家好,我是小哥谈。大模型的预训练成本巨大,优化算法的改进可以加快模型的训练时间并减少训练开销。目前大模型的训练优化器基本上都采用Adam及其变体,并且Adam的应用已经有9个年头了,在模型优化方面相当于霸主的地位。但是能否够在优化器方面提高模型预训练效…

医院挂号系统:基于JSP和MySQL的现代化医疗预约平台

开头语&#xff1a;您好&#xff0c;我是专注于医疗系统开发的IT学长。如果您对医院挂号系统感兴趣&#xff0c;欢迎联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;JSP技术&#xff0c;B/S架构 工具&#xff1a;Eclipse&#xff0c;MyEclips…

中国企业消费管理,驶入“降本”大潮

在足够明晰的成本优化方案之上&#xff0c;能看到除了美团企业版的产品和需求理解能力&#xff0c;更本质的恰在于其最核心的原子能力——即强供应链底座。 这种兼备深度和广度的能力的最终呈现也就是如今美团为企业提供的多元、优质、满足需求的成本考校和计算方案。 作者…

【Python】成功解决TypeError: ‘float‘ object cannot be interpreted as an integer

【Python】成功解决TypeError: ‘float’ object cannot be interpreted as an integer 下滑即可查看博客内容 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地&#xff01;&#x1f387; &#x1f393; 博主…

SpringSecurity中文文档(Servlet CAS)

CAS Authentication Overview JA-SIG 生产了一个名为 CAS 的企业级单点登录系统。与其它倡议不同&#xff0c;JA-SIG 的中央认证服务是开源的&#xff0c;广泛使用&#xff0c;易于理解&#xff0c;平台独立&#xff0c;并支持代理功能。Spring Security 完全支持 CAS&#x…

现代信息检索笔记(一)——课程简介

目录 什么是信息检索 应用一&#xff1a;做搜索引擎 应用二&#xff1a;信息推荐系统 应用三&#xff1a;婚恋网站 信息检索的具体应用 从信息规模上分类 为什么要学习信息检索技术&#xff1f; 市场发展需求大 应用需求多&#xff1a; 课程情况 课程宗旨 国际著名…

客户端渗透

1.一键可执行程序 2.给程序加壳 3.宏病毒感染文档 4.Android apk 利用 1.一键可执行程序 介绍&#xff1a;我们要进行客户端渗透&#xff0c;我们生成一个可执行程序&#xff0c;也是简单粗暴&#xff0c;MSF建立监听&#xff0c;把它发给受害者&#xff0c;只要受害者点击…

【面试系列】C 语言高频面试题

欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;欢迎订阅相关专栏&#xff1a; ⭐️ 全网最全IT互联网公司面试宝典&#xff1a;收集整理全网各大IT互联网公司技术、项目、HR面试真题. ⭐️ AIGC时代的创新与未来&#xff1a;详细讲解AIGC的概念、核心技术、…

VQ-VAE中如何解决梯度截断(不可导)问题?直通估计、(stop gradient,停止梯度)

&#xff08;stop gradient&#xff0c;停止梯度&#xff09;运算 它简称为sg 也就是说&#xff0c;前向传播时&#xff0c;&#x1d460;&#x1d454;里的值不变(sg1)&#xff1b;反向传播时&#xff0c;&#x1d460;&#x1d454;按值为0求导(sg0)&#xff0c;即此次计算无…

canvas画箭头线

箭头线 vueuni-appcanvas 画带箭头可拖动的线段 <template><div><canvas ref"canvas" class"canvas" width"600px" height"400px" mousedown"startDrawing" mousemove"draw" mouseup"stopD…

Centos手动安装PHP和配置mydqli模块

第一步&#xff1a;手动安装php和php-fpm sudo yum install php php-fpm 安装 sudo systemctl start php-fpm 启动 sudo systemctl enable php-fpm 开机启动 php -v php-fpm -v PHP 5.4.16 (cli) (built: Apr 1 2020 04:07:17) Copyright (c) 1997-2013 The PHP G…

【加密与解密】【09】GPG Client签名流程

什么是GPG客户端 GPG客户端是实现PGP加密协议的一套客户端程序&#xff0c;可用于加密或签名 下载GPG客户端 建议安装命令行工具&#xff0c;图形工具一般不具备完整功能 https://gnupg.org/download/index.html生成私钥 此时会要求你输入名称&#xff0c;邮箱&#xff0c…

Qt Q_ASSERT详解

Q_ASSERT详解 引言一、基本用法二、深入了解三、参考链接 引言 Q_ASSERT是 Qt 框架中的一个宏&#xff0c;用于在调试时检查某个条件是否为真。它是程序调试中的一个重要工具&#xff0c;有助于开发者在开发过程中及时发现并修复潜在的错误。 一、基本用法 只在使用 Qt 的 D…

干货:科技论文写作保姆级攻略

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。科技论文是报道自然科学研究或技术开发工作成果的论说文章。通常基于概念、判断、推理、证明或反驳等逻辑思维体系&#xff0c;使用实验调研或理论计算等研究手段&#xff0c;按照特定格式撰写完成。 科技论文可以粗略分为…