Cmake Learn

目录

1 常用命令

(1)configure_file

(2).cmake文件

(3) install

(4)include_directories

(5) add_subdirectory

(6) find_library

2 cmake 生成库文件

(1)目录结构

(2) 代码

3 cmake调用库文件

(1)目录结构

(2)代码


1 常用命令
(1)configure_file

在 CMake 中,configure_file 命令用于复制一个源文件到一个目标位置,并在复制的过程中替换源文件中的某些变量。这对于生成配置头文件特别有用,其中某些值(如路径、版本号等)需要在构建时确定。

(2).cmake文件
file(GLOB FREECAD_HELPER_CMAKE_FILES ./*.cmake)
set(_SKIP_FILES "SetupQt.cmake")
foreach(_CMAKE_FILE ${FREECAD_HELPER_CMAKE_FILES})get_filename_component(_FILENAME ${_CMAKE_FILE} NAME)if (NOT _FILENAME IN_LIST _SKIP_FILES)include(${_CMAKE_FILE})endif()
endforeach(_CMAKE_FILE ${FREECAD_HELPER_CMAKE_FILES})
(3) install

在 CMake 中,install() 命令用于指定构建目标在安装时应该被复制到哪里。这通常用于安装库、头文件、可执行文件等,以便其他项目或用户可以使用它们。

# CMakeLists.txt  
add_executable(my_program main.cpp)  # 安装可执行文件到 /usr/local/bin 目录  
install(TARGETS my_program DESTINATION bin)# CMakeLists.txt  
add_library(my_library my_library.cpp)  # 安装库文件到 /usr/local/lib 目录  
install(TARGETS my_library DESTINATION lib)# CMakeLists.txt  
include_directories(include)  # 安装头文件到 /usr/local/include/my_project 目录  
install(FILES include/my_header.h DESTINATION include/my_project)# CMakeLists.txt  
# 安装多个文件到不同目录  
install(FILES file1.txt file2.txt DESTINATION share/my_project)  # 安装整个目录及其内容  
install(DIRECTORY doc/ DESTINATION share/my_project/docs)
(4)include_directories

在 CMake 中,include_directories() 命令用于向编译器添加包含目录,使得在编译源文件时可以找到所需的头文件。这通常用于指定项目中的头文件目录,或者是第三方库的头文件目录。

# 添加多个头文件目录  
include_directories(  include  third_party/library1/include  third_party/library2/include  
)  
(5) add_subdirectory

 add_subdirectory 是 CMake 中的一个命令,用于将子目录添加到构建过程中。这个命令的作用是在当前 CMakeLists.txt 文件的对应位置包含子目录中的 CMakeLists.txt 文件,并执行其中的命令。这使得项目的组织和管理变得更为容易和高效。

cmake_minimum_required(VERSION 3.10)  
project(MyProject)  # 添加子目录 src 到构建中  
add_subdirectory(src)  # 在父目录的 CMakeLists.txt 中,你还可以链接子目录中定义的目标  
target_link_libraries(MyApp MyLib) # 假设 MyLib 是在 src 目录中定义的目标
(6) find_library
find_library(CMAKE_LIB cmake_library HINTS ${CMAKE_CURRENT_SOURCE_DIR}/../lib)
# 打印PROJECT_SOURCE_DIR变量的值
message(STATUS "PROJECT_SOURCE_DIR is: ${PROJECT_SOURCE_DIR}")
# 如果CMAKE_LIB变量被成功设置(即库被找到),你也可以打印它的值
if(CMAKE_LIB)message(STATUS "Found library: ${CMAKE_LIB}")
else()message(FATAL_ERROR "Library not found!")
endif()

find_library(<VARNAME> name [path1 path2 ...]  
              [NO_DEFAULT_PATH] [NO_CMAKE_ENVIRONMENT_PATH]  
              [NO_CMAKE_PATH] [NO_SYSTEM_ENVIRONMENT_PATH]  
              [NO_CMAKE_SYSTEM_PATH] [CMAKE_FIND_ROOT_PATH_BOTH |  
              ONLY_CMAKE_FIND_ROOT_PATH | NO_CMAKE_FIND_ROOT_PATH])
 

  • <VARNAME>:一个变量名,用于存储找到的库的完整路径。
  • name:要查找的库的名字,不带前缀(比如 lib)和后缀(比如 .so.a.dylib.lib 等)。
  • path1 path2 ...:可选参数,指定额外的路径来搜索库文件。
target_link_libraries(cmake_test PRIVATE Qt5::Widgets ${CMAKE_LIB})

在 CMake 中,target_link_libraries 命令用于指定一个目标(例如库或可执行文件)需要链接的库。这个命令将库添加到目标的链接器命令中,以便在构建目标时能够解析目标中的外部符号。

在你提供的命令 target_link_libraries(cmake_test PRIVATE Qt5::Widgets ${CMAKE_LIB}) 中:

  • cmake_test 是你想要链接库的目标名。
  • PRIVATE 是一个关键字,它指定了链接库的可见性范围。PRIVATE 表示这个库只会被 cmake_test 目标使用,并且不会传递给依赖于 cmake_test 的其他目标。CMake 提供了几种可见性范围,包括 PUBLICPRIVATE 和 INTERFACE,它们决定了库是如何被传播到依赖目标的。
  • Qt5::Widgets 是一个由 find_package(Qt5 COMPONENTS Widgets) 提供的导入目标,它代表 Qt5 Widgets 模块。使用导入目标而不是直接指定库文件路径是 CMake 推荐的做法,因为它可以自动处理库的依赖关系和其他平台相关的细节。
  • ${CMAKE_LIB} 是一个变量,它应该在 CMakeLists.txt 文件的某个地方被定义。这个变量可能包含了一个或多个需要链接的库名或库文件路径。使用 ${...} 语法是 CMake 中获取变量值的方式。

这个命令的意思是:为 cmake_test 目标链接 Qt5 的 Widgets 模块,并链接由 ${CMAKE_LIB} 变量指定的库。

确保你已经通过 find_package 或其他方式找到了 Qt5 Widgets 模块,并且已经定义了 CMAKE_LIB 变量。如果 CMAKE_LIB 变量没有被正确设置,这个命令将不会按预期工作。通常,CMAKE_LIB 变量可能是在 CMakeLists.txt 文件的某个地方通过 find_library 或其他方式设置的。

2 cmake 生成库文件
(1)目录结构

(2) 代码

CMakeLists.txt

cmake_minimum_required(VERSION 3.5)project(cmake_library LANGUAGES CXX)set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)find_package(Qt5 COMPONENTS Core REQUIRED)add_library(cmake_library SHAREDcmake_library_global.hcmake_library.cppcmake_library.h
)target_link_libraries(cmake_library PRIVATE Qt5::Core)target_compile_definitions(cmake_library PRIVATE CMAKE_LIBRARY_LIBRARY)

cmake_library_global.h

#ifndef CMAKE_LIBRARY_GLOBAL_H
#define CMAKE_LIBRARY_GLOBAL_H#include <QtCore/qglobal.h>#if defined(CMAKE_LIBRARY_LIBRARY)
#  define CMAKE_LIBRARY_EXPORT Q_DECL_EXPORT
#else
#  define CMAKE_LIBRARY_EXPORT Q_DECL_IMPORT
#endif#endif // CMAKE_LIBRARY_GLOBAL_H

cmake_library.h

#ifndef CMAKE_LIBRARY_H
#define CMAKE_LIBRARY_H#include "cmake_library_global.h"class CMAKE_LIBRARY_EXPORT Cmake_library
{
public:Cmake_library();int add(int a,int b);
};#endif // CMAKE_LIBRARY_H

cmake_library.cpp

#include "cmake_library.h"Cmake_library::Cmake_library()
{
}int Cmake_library::add(int a, int b)
{return a + b;
}
3 cmake调用库文件
(1)目录结构

(2)代码

 外层CMakeLists.txt

project(cmake_test LANGUAGES CXX)set(CMAKE_INCLUDE_CURRENT_DIR ON)set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)add_subdirectory(src bin)

src/CMakeLists.txt

cmake_minimum_required(VERSION 3.5)find_package(Qt5 COMPONENTS Widgets REQUIRED)
find_library(CMAKE_LIB cmake_library HINTS ${CMAKE_CURRENT_SOURCE_DIR}/../lib)
# 打印PROJECT_SOURCE_DIR变量的值
message(STATUS "PROJECT_SOURCE_DIR is: ${PROJECT_SOURCE_DIR}")
# 如果CMAKE_LIB变量被成功设置(即库被找到),你也可以打印它的值
if(CMAKE_LIB)message(STATUS "Found library: ${CMAKE_LIB}")
else()message(FATAL_ERROR "Library not found!")
endif()include_directories (../inc/)
set(SRC_LISTmain.cppmainwindow.cpp../inc/mainwindow.h)add_executable(cmake_test${SRC_LIST}
)target_link_libraries(cmake_test PRIVATE Qt5::Widgets ${CMAKE_LIB})

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

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

相关文章

FPGA秋招-笔记整理(3)无符号数、有符号数

参考&#xff1a;Verilog学习笔记——有符号数的乘法和加法 一、无符号数、有符号数 将输入输出全部定义为有符号数 &#xff08;1&#xff09;无符号数的读取按照原码进行&#xff0c;有符号数的读取应该按照补码读取&#xff0c;计算规则为去掉符号位后取反、加1在计算数值…

中国人工智能奠基人张钹院士:走进“无人区” 探索人工智能之路

4月23日&#xff0c;中国人工智能奠基人、清华大学计算机系教授、中国科学院院士张钹在“人文清华”讲坛作专题分享。在2小时的直播中&#xff0c;张钹以《走进“无人区” 探索人工智能之路》为主题&#xff0c;回顾人工智能的发展历程&#xff0c;为大家解读ChatGPT的意义&…

掺硼金刚石电极(BDD电极)电化学特性优异 全球市场将持续扩大

掺硼金刚石电极&#xff08;BDD电极&#xff09;电化学特性优异 全球市场将持续扩大 掺硼金刚石电极&#xff0c;简称BDD电极&#xff0c;是以掺硼金刚石&#xff08;BDD&#xff09;为材料制造而成的电极&#xff0c;即以金属或非金属材料为衬底&#xff0c;采用化学气相沉积法…

基于Springboot的web后端开发三层架构上手实操

引言 我们拿到了xml文件 我们要将将xml文件中的数据加载并解析 完成数据的处理 并且返回给前端页面(result格式) 1.将xml文件放在resources目录下 xml是我们需要解析的文件 查看xml文件 2.在springboot中引入dom4j依赖 解析xml需要在springboot中引入dom4j依赖 这边我们…

Thread类的基本用法

1.线程创建 这里介绍线程创建常用的五种方法 1.继承Thread&#xff0c;重写run class MyThread extends Thread{public void run(){//这里写的代码就是线程要完成的任务while (true){System.out.println("hello thread");try {Thread.sleep(1000);//线程会休眠一秒…

二维码门楼牌管理应用平台建设:取保候审人员管理的新模式

文章目录 前言一、取保候审人员管理的新挑战二、二维码门楼牌管理应用平台的引入三、平台的功能与应用四、优势与挑战五、结论 前言 随着科技的不断进步&#xff0c;二维码门楼牌管理应用平台已成为城市管理的创新手段。特别是在取保候审人员管理领域&#xff0c;这一技术的应…

电视盒子哪款好?实体店主盘点畅销电视盒子排名

电视盒子功能丰富&#xff0c;是升级电视机最具性价比的方案。我本人做实体数码店多年来&#xff0c;电视盒子是店内销量最好的产品之一&#xff0c;最近很多网友在讨论电视盒子哪款好&#xff0c;我整理了店内销量最好的电视盒子排名&#xff0c;想买电视盒子可以看看下面这几…

海外盲盒App开发:探索全球惊喜,开启无限可能

一、前言 随着全球化的深入发展&#xff0c;人们对于不同文化、不同地域的商品充满了好奇与向往。盲盒文化&#xff0c;作为一种充满神秘与惊喜的消费方式&#xff0c;正逐渐在全球范围内受到热烈追捧。为了满足海外用户对于盲盒的需求&#xff0c;我们团队精心策划并开发了一…

盲人安全过马路:科技赋能,独立出行不再难

作为一位资深记者&#xff0c;我长期关注特殊群体的生活现状与科技助力下的改善举措。今天&#xff0c;我要讲述的是盲人朋友在独立出行&#xff0c;尤其是过马路时面临的挑战&#xff0c;以及一款叫做蝙蝠避障的创新辅助应用如何通过实时避障与拍照识别功能&#xff0c;显著提…

IntelliJ IDEA 如何启用 JDK 预览特性

IntelliJ IDEA 也可以启用 JDK 的预览特性。 针对项目&#xff0c;选择项目结构。 配置是在语言结构上。 单击语言结构上的 SDK 默认&#xff0c;往下拉&#xff0c;就可以看到针对新版本的选项。 同时还可以看到那些版本是支持新特性预览的&#xff0c;那些版本是不支持新特…

Vue报错 Cannot read properties of undefined (reading ‘websiteDomains‘) 解决办法

浏览器控制台如下报错&#xff1a; Unchecked runtime.lastError: The message port closed before a response was received. Uncaught (in promise) TypeError: Cannot read properties of undefined (reading websiteDomains) at xl-content.js:1:100558 此问题困扰了…

多目标粒子群算法及其MATLAB实现

多目标粒子群优化&#xff08;Multi-Objective Particle Swarm Optimization, MOPSO&#xff09;算法是一种基于种群的优化算法&#xff0c;它结合了粒子群优化&#xff08;Particle Swarm Optimization, PSO&#xff09;和多目标优化的思想。多目标粒子群&#xff08;MOPSO&am…

开发工具-pycharm的代码自动部署服务器以及服务端python配置、项目开发环境一键启动服务

文章目录 一、pycharm的ssh配置1.本地生成ssh密钥2.密钥配置到远端服务器(1-1) 有权限ssh访问到服务器(1-2) 无权限ssh访问到服务器(1-3) 没有办法通过以上形式上传到服务器(2) 配置到authorized_keys自动访问 3.pycharm中配置ssh(1) 选择File中的settings(1) 选择Tools中的SSH…

js的算法-插入排序(折半插入排序)

直接插入排序的步骤 1. 从前面的有序子表中查找出待插入元素应该被插入的位置 2. 给插入位置腾空间 3. 将待插入元素复制到表中的插入位置。 直接插入排序&#xff1a;边比较边移动&#xff1b; 折半插入排序 先折半查找出元素的待插入位置&#xff0c;然后统一地移动待插…

上位机图像处理和嵌入式模块部署(树莓派4b之远程vnc桌面访问)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 对于很多嵌入式开发比较精通的同学来说&#xff0c;使用命令行和开发板之间进行沟通是他们完全能够接受的一种开发方式。但是对于更多的朋友来说&a…

0425DormAJAX项目

0425DormAJAX项目包-CSDN博客 数据库字段 添加界面&#xff1a; 初始状态&#xff1a; 点击性别&#xff0c;宿舍号使用ajax动态添加&#xff1a; 学生主界面&#xff1a; 实现分页查询&#xff1a; 点击修改学生宿舍&#xff0c;查看换寝记录&#xff0c;ajax动态显示列表&…

C语言例题29:在屏幕上显示一个等腰三角形

#include <stdio.h>void main() {int i, j;int x;printf("输入等腰三角形行数&#xff1a;");scanf("%d", &x);for (i 1; i < x; i) {for (j i; j < x; j) {printf(" "); //输出空格占位}for (j 1; j < 2 * i; j) {printf…

接字符串注入攻击简介

连接字符串注入攻击简介 什么是连接字符串注入攻击&#xff1f; 连接字符串注入攻击是一种安全攻击类型&#xff0c;攻击者通过修改应用程序使用的数据库连接字符串来注入恶意内容。连接字符串是包含数据库连接所需数据&#xff08;如服务器地址、数据库名、用户名和密码等&a…

5.1 海思SS928开发 - kernle开发 - 镜像制作

5.1 kernle开发 - 镜像制作 本文主要讲解如何编译生成可用的 ss928 kernel 镜像。 ATF&#xff08;ARM Trusted Firmware&#xff09;准备 准备步骤如下&#xff1a; cd ~/hiss928/kernel/ss928_kernel_v4.19/ # 拷贝相关文件 cp -rf ~/hiss928/sdk/ema_2.0.2.2/SS928V100_SD…

吴恩达2022机器学习专项课程(一) 7.1 逻辑回归的成本函数第三周课后实验:Lab4逻辑回归的损失函数

问题预览/关键词 上节课回顾逻辑回归模型使用线性回归模型的平方误差成本函数单个训练样本的损失损失函数&#xff0c;成本函数&#xff0c;代价函数的区别线性回归损失函数和逻辑回归损失函数的区别逻辑回归模型的成本函数是什么&#xff1f;逻辑回归模型的损失函数实验逻辑回…