Cmake Learn

news/2024/9/23 14:35:51/

目录

1 常用命令

(1)configure_file

make%E6%96%87%E4%BB%B6-toc" style="margin-left:200px;">(2).cmake文件

(3) install

(4)include_directories

(5) add_subdirectory

(6) find_library

make%20%E7%94%9F%E6%88%90%E5%BA%93%E6%96%87%E4%BB%B6-toc" style="margin-left:160px;">2 cmake 生成库文件

(1)目录结构

(2) 代码

make%E8%B0%83%E7%94%A8%E5%BA%93%E6%96%87%E4%BB%B6-toc" style="margin-left:160px;">3 cmake调用库文件

(1)目录结构

(2)代码


1 常用命令
(1)configure_file

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

make%E6%96%87%E4%BB%B6">(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 或其他方式设置的。

make%20%E7%94%9F%E6%88%90%E5%BA%93%E6%96%87%E4%BB%B6">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;
}
make%E8%B0%83%E7%94%A8%E5%BA%93%E6%96%87%E4%BB%B6">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.ppmy.cn/news/1448056.html

相关文章

Microsoft Universal Print 与 SAP 集成教程

引言 从 SAP 环境打印是许多客户的要求。例如数据列表打印、批量打印或标签打印。此类生产和批量打印方案通常使用专用硬件、驱动程序和打印解决方案来解决。 Microsoft Universal Print 是一种基于云的打印解决方案&#xff0c;它允许组织以集中化的方式管理打印机和打印机驱…

【Easy云盘 | 完结撒花】用户分享模块以及部分优化

前言&#xff1a; 本项目非原创&#xff0c;我也只是作为一名初学者跟着成熟的up主一起敲代码而已。视频来源于&#xff1a; Springboot项目实战 easypan 仿百度网盘 计算机毕业设计 简历项目 项目经验(后端)_哔哩哔哩_bilibiliSpringboot项目实战 easypan 仿百度网盘 计算机毕…

C++中的右值引用和移动语义

1 左值引用和右值引用 传统的C语法中就有引用的语法&#xff0c;而C11中新增了的右值引用语法特性&#xff0c;所以从现在开始我们之前学习的引用就叫做左值引用。无论左值引用还是右值引用&#xff0c;都是给对象取别名。 什么是左值&#xff1f;什么是左值引用&#xff1f; 左…

基于JAVA与JSP的记账管理系统设计与实现:技术深度解析与心得分享

引言 在数字化时代背景下&#xff0c;个人财务管理的便捷性和实时性变得尤为重要。本次毕业设计的核心是开发一款基于JAVA与JSP技术的记账管理系统&#xff0c;旨在帮助用户高效地记录和分析个人财务状况。本文将深入探讨系统设计的技术细节&#xff0c;并分享开发过程中的心得…

【3GPP IAB】 3GPP支持IAB架构概述

1 概述 IAB用于回传链路的无线传输&#xff0c;对于NR高频尤其重要&#xff0c;3GPP协议讨论了IAB的可能架构和部署方式&#xff0c;一起来看看吧。 2 IAB 功能和接口 IAB尽量重用为接入定义的现有功能和接口。特别是&#xff0c;移动终端(MT)、gNB- DU、gNB- CU、UPF、AMF和S…

vue中nextTick函数和react类似实现

Vue 3 基本用法&#xff1a; import { nextTick } from vue;// 全局调用 nextTick(() > {// 在下一个 DOM 更新循环后执行的代码 });// 在组件内部调用 setup() {async function handleUpdate() {// 修改数据...await nextTick();// 在数据引发的 DOM 更新完成后执行的代码}…

Centos的一些基础命令

CentOS是一个基于开源代码构建的免费Linux发行版&#xff0c;它由Red Hat Enterprise Linux (RHEL) 的源代码重新编译而成。由于 CentOS是基于RHEL构建的&#xff0c;因此它与RHEL具有非常类似的特性和功能&#xff0c;包括稳定性、安全性和可靠性。并且大部分的 Linux 命令在C…

lua编译器和lua解释器、lua虚拟机的区别

一、区别总结 lua编译器&#xff1a; 将lua源代码编译成字节码&#xff0c;提高代码加载速度 lua解释器&#xff1a;逐条执行编译器生成的字节码&#xff0c;并将其转换为虚拟机可以执行的指令。 lua虚拟机&#xff1a;提供了执行指令所需要的环境 二、lua编译器 Lua编译器的主…