Cmake Learn

news2024/11/16 1:34:08

目录

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 SHARED
  cmake_library_global.h
  cmake_library.cpp
  cmake_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_LIST
    main.cpp
    mainwindow.cpp
    ../inc/mainwindow.h

)

add_executable(cmake_test
  ${SRC_LIST}
)

target_link_libraries(cmake_test PRIVATE Qt5::Widgets ${CMAKE_LIB})

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

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

相关文章

GDPU JavaWeb Servlet实现

踏入mvc的Controller层&#xff0c;实现servlet配置。 登录页面 1.参考课堂例子&#xff0c;客户端通过login.jsp发出登录请求&#xff0c;请求提交到loginServlet处理。如果用户名和密码相同则视为登录成功&#xff0c;跳转到loginSuccess.jsp页面&#xff0c;显示“欢迎你”用…

SpringBoot + Vue实现Github第三方登录

前言&#xff1a;毕业设计终于好了&#xff0c;希望能有空多写几篇 1. 获取Github账号的Client ID和Client secrets 首先点击这个链接进入Github的OAuth Apps页面&#xff0c;页面展示如下&#xff1a; 之后我们可以创建一个新的apps: 填写资料&#xff1a; 创建之后就可以获…

从关键新闻和最新技术看AI行业发展(2024.2.12-2.25第十七期) |【WeThinkIn老实人报】

写在前面 【WeThinkIn老实人报】旨在整理&挖掘AI行业的关键新闻和最新技术&#xff0c;同时Rocky会对这些关键信息进行解读&#xff0c;力求让读者们能从容跟随AI科技潮流。也欢迎大家提出宝贵的优化建议&#xff0c;一起交流学习&#x1f4aa; 欢迎大家关注Rocky的公众号&…

Redux入门:使用@reduxjs/toolkit构建React应用程序状态管理

随着应用程序复杂性的增加,有效管理应用程序状态变得越来越重要。Redux是一种流行的状态管理解决方案,随着应用程序复杂性的增加,有效管理应用程序状态变得越来越重要。Redux是一种流行的状态管理解决方案,但传统的Redux设置和使用过程比较繁琐。幸运的是,Redux官方团队推出了r…

【Linux】NFS网络文件系统搭建

一、服务端配置 #软件包安装 [roothadoop01 ~]# yum install rpcbind nfs-utils.x86_64 -y [roothadoop01 ~]# mkdir /share#配置文件修改 #格式为 共享资源路径 [主机地址] [选项] # [roothadoop01 ~]# vi /etc/exports /share 192.168.10.0/24(rw,sync,no_root_squash) #…

Git 使用 下载分支 提交新项目到当前分支 三(公司快速上手版)

文章背景 git已经装好了&#xff0c;公司的也给创建好账户了&#xff0c;仓库地址也有了。 领导已经给你说了是哪个分支了。 如何下载远程仓库中的一个项目分支&#xff0c;到本地电脑上。 并且如何将新建的项目上传到当前分支的远程仓库 下载 步骤 创建文件夹。 右键 Op…

springboot权限验证学习-上

创建maven项目 创建父工程 这类项目和原来项目的区别在于&#xff0c;打包方式是pom 由于pom项目一般都是用来做父项目的&#xff0c;所以该项目的src文件夹可以删除掉。 创建子工程 子工程pom.xml 父工程pom.xml 添加依赖 父工程导入依赖包 <!--导入springboot 父工程…

【MyBatis】初步解析MyBatis:实现数据库交互与关系映射的全面指南

&#x1f493; 博客主页&#xff1a;从零开始的-CodeNinja之路 ⏩ 收录文章&#xff1a;【MyBatis】初步解析MyBatis&#xff1a;实现数据库交互与关系映射的全面指南 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 目录 前言什么是MyBatis?一. MyBa…

六.音视频编辑-创建视频过渡-概述

引言 目前我的应用已经实现了视频的编辑&#xff0c;音频的混合处理。随着时间的推进&#xff0c;两个不同场景的视频快速的切换&#xff0c;其中没有任何过渡效果。通常画面在时间轴上出现明显的变化时&#xff0c;两个场景间会使用一些动画的过渡效果。比如渐隐&#xff0c;…

麦肯锡报告:《在实现量子优势方面稳步推进》

2024年4月24日&#xff0c;麦肯锡一年一度的Quantum Technology Monitor发布了其最新的2024年研究报告&#xff0c;提供对全球量子技术&#xff08;QT&#xff09;、投资、生态系统等发展现状的见解。 此次&#xff0c;麦肯锡为第三届年度Quantum Technology Monitor报告所做的…

[C++]22:C++11_part_one

C11 一.列表初始化&#xff1a;1.{}初始化&#xff1a;2.C11扩大了列表初始化的范围&#xff1a;3.std::initializer_list1.简单类型的列表初始化&#xff1a;2.复杂类型的列表初始化3.实现vector的列表初始化4.实现list的列表初始化&#xff1a;5.不支持列表初始化&#xff1a…

多用户商城系统哪个好,2024多用户商城系统这样选

在2024年选择适合的多用户商城系统是一项至关重要的决策&#xff0c;因为一个优秀的商城系统不仅可以提升用户体验&#xff0c;还能够帮助企业实现业务目标并取得长期成功。然而&#xff0c;在众多的选择中挑选出最适合的一个并不容易&#xff0c;需要综合考虑各种因素&#xf…

网页模版如何用

现在的网页模版已经得到了许多人的喜爱和使用。随着人们对互联网的需求不断增加&#xff0c;更多的公司和组织需要拥有自己的网站&#xff0c;以推广他们的品牌和服务。而网页模版为他们提供了一个简单而高效的方法来创建自己的网站。 网页模版是预先设计好的网站模板&#xff…

docker容器通俗理解

前言 如果大家没使用过Docker,就在电脑上下载一个VMware Workstation Pro&#xff0c;创建一个虚拟机安装一个windows操作一下感受一下,为什么我的电脑上还以再安装一台windows主机&#xff1f;其实你可以理解为Docker就是Linux系统的一个虚拟机软件。 我的Windows也可以安装…

(学习日记)2024.05.08:UCOSIII第六十二节:常用的结构体(os.h文件)第一部分

之前的章节都是针对某个或某些知识点进行的专项讲解&#xff0c;重点在功能和代码解释。 回到最初开始学μC/OS-III系统时&#xff0c;当时就定下了一个目标&#xff0c;不仅要读懂&#xff0c;还要读透&#xff0c;改造成更适合中国宝宝体质的使用方式。在学完野火的教程后&a…

Java基础教程- 1 Java 简介

更好的阅读体验&#xff1a;点这里 &#xff08; www.doubibiji.com &#xff09; 1 Java 简介 1.1 Java语言概述 1.1.1 Java是什么 &#xff08;了解一下即可&#xff0c;对学习没影响&#xff0c;总得了解一下它是怎么来滴~&#xff09; Java是由Sun公司&#xff08;已…

五一景点预约怎么预约 预约时间用备忘录设置提醒不怕错过

五一小长假即将来临&#xff0c;相信很多人和我一样&#xff0c;已经跃跃欲试&#xff0c;准备踏上旅途&#xff0c;去探索那些心仪已久的风景名胜。但在这个旅游高峰期&#xff0c;不少热门景点都需要提前预约购票。那么&#xff0c;怎么预约才能确保顺利游览呢&#xff1f; …

在智慧城市的建设中智能电表发挥什么作用

在智慧城市的建设中&#xff0c;智能电表扮演着至关重要的角色。智慧城市是一个利用信息技术手段提升城市运行效率和质量的新型城市模式&#xff0c;旨在通过信息和通信技术的应用&#xff0c;提高城市管理、公共服务、环境保护等方面的质量和效率&#xff0c;促进城市的可持续…

金价大跳水,美梦变噩梦!2024真正适合普通人的靠谱创业项目!2024适合30-40岁轻资产小生意

4月22日晚间&#xff0c;向上“狂飙”了一个多月的金价突然就“大跳水”。当日&#xff0c;每克金价均下调14块。在这次跳水中&#xff0c;有人欢喜有人愁&#xff1a;有投资者自报做空金价一夜狂赚14万&#xff0c;也有投资者哭诉&#xff0c;头晚进货到早上就净亏损2万&#…

中电金信:GienTech动态| 获奖、合作、与伙伴共谋数字化转型…

—— —— GienTech动态 —— —— 中电金信携“源启”亮相第十二届中国电子信息博览会 4月11日&#xff0c;为期三天的“第十二届中国电子信息博览会”在深圳顺利闭幕。中国电子信息博览会是中国规模最大、最具国际影响力的电子信息产业盛会之一。本届大会以“全球视野&#x…