首页 > 其他分享 >CMake Tutorial

CMake Tutorial

时间:2024-05-17 19:41:19浏览次数:22  
标签:set CMake target cxx MathFunctions add Tutorial

step 1

the minal project

cmake_minimum_required(VERSION 3.10)
project(Tutorial)
add_executable(Tutorial tutorial.cxx)

specifying c++ standard

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)

project version

project(Tutorial VERSION 1.0)
# the config file
configure_file(TutorialConfig.h.in TutorialConfig.h)
target_include_directories(Tutorial PUBLIC
                           "${PROJECT_BINARY_DIR}"
                           )

the definiation

#define Tutorial_VERSION_MAJOR @Tutorial_VERSION_MAJOR@
#define Tutorial_VERSION_MINOR @Tutorial_VERSION_MINOR@

step 2 add library

different level of cmake

# MathFunctions/CMakeLists.txt
add_library(MathFunctions MathFunctions.cxx mysqrt.cxx)

# main
add_subdirectory(MathFunctions)
target_link_libraries(Tutorial PUBLIC MathFunctions) # link
target_include_directories(Tutorial PUBLIC
                          "${PROJECT_BINARY_DIR}"
                          "${PROJECT_SOURCE_DIR}/MathFunctions"
                          )

add option 通常和 宏定义一起使用

# MathFunctions/CMakeLists.txt
add_library(MathFunctions MathFunctions.cxx )
# define a cache variable and set it on
option(USE_MYMATH "Use tutorial provided math implementation" ON)

# use if
if (USE_MYMATH)
	target_compile_definitions(MathFunctions PRIVATE "USE_MYMATH")
	add_library(SqrtLibrary STATIC
			  mysqrt.cxx
			  )
			  
	target_link_libraries(MathFunctions PRIVATE SqrtLibrary) 
endif()

我们将自己的 mysqrt.cxx 作为一个库, 如果 有 USE_MYMATH 我们会将其作为一个库添加到 MathFunctions, 在外部 Tutorial 中,只需要知道链接 MathFunctions 就可以了,不需要具体的实现细节。

the cxx file

#include <cmath>
#ifdef USE_MYMATH
#  include "mysqrt.h"
#endif

#ifdef USE_MYMATH
  return detail::mysqrt(x);
#else
  return std::sqrt(x);
#endif

step3 add usage required lib

任何想要使用 MathFunctions 的 都需要 inlucde 当前文件,但是 MathFunctions 不需要。因此我们使用 INTERFACE

Remember INTERFACE means things that consumers require but the producer doesn't.

target_include_directories(MathFunctions
                           INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}
                           )

此时 main 中 我们就可以移除 add_include 文件。 main 中只需要使用 target_link_libraries() 链接目标哭的名字。

为库添加特性

创建一个 INTERFACE 的库 --- 一个虚拟库。然后给这个接口库设置了一个编译特性cxx_std_11。那么只要依赖找个虚拟库的对象,在编译时都会使用到cxx_std_11找个特征。

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)

add_library(tutorial_compiler_flags INTERFACE)
target_compile_features(tutorial_compiler_flags INTERFACE cxx_std_11)

此时 在不同的库 就可以通过引入这个库来添加 c++ 11 的特性

target_link_libraries(Tutorial PUBLIC MathFunctions tutorial_compiler_flags)
target_link_libraries(SqrtLibrary PUBLIC tutorial_compiler_flags)
target_link_libraries(MathFunctions PUBLIC tutorial_compiler_flags)

当然也可以直接,设置,上面的好处是可以同时设置多个。

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)

target_compile_features(Tutorial INTERFACE cxx_std_11)

step4 : add generator expression

# 当编译单元的语言与language匹配且CMake编译器id和compiler_ids中任意匹配则为1,否则为0
set(gcc_like_cxx "$<COMPILE_LANG_AND_ID:CXX,ARMClang,AppleClang,Clang,GNU,LCC>")
# 当使用c++和msvc编译器时mscv_cxx变量值为1
set(msvc_cxx "$<COMPILE_LANG_AND_ID:CXX,MSVC>")

cmake构建分为config和build阶段,生成器表达式的值在build阶段才得到。生成器表达式可用于根据某些条件设置某些变量和编译选项。

$<condition:true_string>
$<IF:condition,true_string,false_string>

当condition为真则返回true_string字符串,否则返回空字符串

target_compile_options(tutorial_compiler_flags INTERFACE
  "$<${gcc_like_cxx}:-Wall;-Wextra;-Wshadow;-Wformat=2;-Wunused>"
  "$<${msvc_cxx}:-W3>"
)

可以嵌套

$<${msvc_cxx}:$<BUILD_INTERFACE:-W3>>

https://www.bilibili.com/video/BV1Tw411s7Pk/?spm_id_from=333.788&vd_source=8beb74be6b19124f110600d2ce0f3957

标签:set,CMake,target,cxx,MathFunctions,add,Tutorial
From: https://www.cnblogs.com/bigsharker/p/18198475

相关文章

  • CMake Professtional-2 Variables
    set(varNamevalue...[PARENT_SCOPE])cmake中所有的值都是string,如果同时添加多个值,会自动添加;set(myVarabc)#myVar="a;b;c"set(myVara;b;c)#myVar="a;b;c"set(myVar"abc")#myVar="abc"set(myVarab;c)#myVar=&q......
  • CMake Professtional-1 Introduction
    thestageofcmakeGeneratingProjectFileschooseaprojectgenerator:Ninja,UnixMakefiles,MSYSMakefilesmkdirbuildcdbuildcmake-G"UnixMakefiles"../source#use--helpcandisplaythevariablecmake-G-hbuildingtoolcmake--bui......
  • HTML Tutorial
     HTMLstandsforHyperTextMarkupLanguage,itisaStandardMarkuplanguageforwebpages.HTMLisusedtocreatecontentandstructureofanywebpage.IfyouthinkofthehumanbodyasawebpagethenHTMListheskeletonofthebody.Itisthebuildi......
  • Windows Basics - Finding Files on Your Computer Back to Tutorial
     everything 推荐用这个工具搜索文件 FindingfilesonyourcomputerInthepreviouslesson,wetalkedabouthowfolderscanhelptokeepyourfilesorganized.However,theremaybetimeswhenyouhavetroublefindingacertainfile.Ifthishappenstoyou......
  • cmakelist的一个例子
    一个例子,仅做参考用: CMAKE_MINIMUM_REQUIRED(VERSION3.12)set(ProjName"NetworkTest")project(${ProjName})string(FIND${CMAKE_CURRENT_BINARY_DIR}"/"pos0REVERSE)MATH(EXPRpos0${pos0}+1)string(SUBSTRING${CMAKE_CURRENT_BINARY_DIR}${po......
  • Cmake打印信息
    messageLogamessage.SynopsisGeneralmessagesmessage([<mode>]"messagetext"...)Reportingchecksmessage(<checkState>"messagetext"...)Generalmessagesmessage([<mode>]"messagetext"...)......
  • windows下源码编译CMake项目
    Cmake项目1、安装路径和源码安装包下载地址:https://cmake.org/download/源码地址https://github.com/Kitware/CMake2、编译源码下载后会有一个CMake-master的文件夹在里面新建一个build目录打开cmake-gui可执行文件出现cmake的界面,设置source路径为刚刚的CMake-......
  • [Cmake Qt]找不到文件ui_xx.h的问题?有关Qt工程的问题,看这篇文章就行了。
    前言最近在开发一个组件,但是这个东西是以dll的形式发布的界面库,所以在开发的时候就需要上层调用。如果你是很懂CMake的话,ui_xx.h的文件目录在$下然后除了有关这个ui_xx.h,还有一些别的可以简单聊聊的一、父子工程组织,或者说依赖关系在使用CMake进行开发的时候,一般可以有......
  • 一个CMake的例子
    首先编写4个文件:1、CMakeLists.txt内容:cmake_minimum_required(VERSION3.15)project(Demo)include_directories(${PROJECT_BINARY_DIR}/headers)aux_source_directory(${PROJECT_BINARY_DIR}/sourcesSRC_DIR)add_library(dynamic_librarySHARED${SRC_DIR})add_libr......
  • CMake中里的find_package与find_library有什么区别?
    在CMake中,find_package和find_library都是用来找到和链接库的方法,但它们的用法和适用场景略有不同。find_package主要用于寻找具有CMake配置文件的库,这些库通常遵循CMake的规范,提供了用于导入目标、库路径、头文件路径等的配置文件。这使得使用find_package更加简洁,只需指定需......