首页 > 其他分享 >Cmake 基础教程

Cmake 基础教程

时间:2023-06-14 10:35:11浏览次数:38  
标签:cmake libanswer cpp build 基础教程 answer Cmake include

介绍

CMake是个一个开源的跨平台自动化建构系统,用来管理软件建置的程序,并不依赖于某特定编译器,并可支持多层目录、多个应用程序与多个库。 它用配置文件控制建构过程(build process)的方式和Unix的make相似,只是CMake的配置文件取名为CMakeLists.txt。CMake并不直接建构出最终的软件,而是产生标准的建构档(如Unix的Makefile或Windows Visual C++的projects/workspaces),然后再依一般的建构方式使用。

CmakeLists.txt

一个简单的CmakeLists.txt示例如下:

# 指定最小 CMake 版本要求
cmake_minimum_required(VERSION 3.9)
# 设置项目名称
project(answer)

#[[
添加可执行文件 target,类似于原来 Makefile 的:

    answer: main.o answer.o
    main.o: main.cpp answer.hpp
    answer.o: answer.cpp answer.hpp

CMake 会自动找到依赖的头文件,因此不需要特别指定,
当头文件修改的时候,会重新编译依赖它的目标文件。
#]]
add_executable(answer main.cpp answer.cpp)

#[[
使用如下命令构建本项目:

    cmake -B build      # 生成构建目录
    cmake --build build # 执行构建
    ./build/answer      # 运行 answer 程序
#]]

其中cmake -B build命令中的-B参数是可选的,生成的文件会放到build文件夹中(没有该文件夹则会自动创建,最好原先没有)。

cmake --build build是执行构建,生成可执行文件,build指的是上一步-B参数指定的文件夹。

分离库文件情形下的CMakeLists.txt

cmake_minimum_required(VERSION 3.9)
project(answer)

# 添加 libanswer 库目标,STATIC 指定为静态库
add_library(libanswer STATIC answer.cpp)

add_executable(answer main.cpp)

# 为 answer 这一可执行目标链接库 libanswer
target_link_libraries(answer libanswer)

子目录设置

我们考虑将answer相关的头文件和源文件都放入到answer目录下,则在CmakeLists.txt中要做对应修改,使cmake会检索对应目录下的文件。

目录结构

cmake_minimum_required(VERSION 3.9)
project(answer)

# 添加 answer 子目录
add_subdirectory(answer)

add_executable(answer_app main.cpp)
target_link_libraries(answer_app libanswer)

#[[
使用如下命令构建本项目:

    cmake -B build      # 生成构建目录
    cmake --build build # 执行构建
    ./build/answer_app  # 运行 answer_app 程序
#]]

子目录中CmakeLists.txt内容如下:

add_library(libanswer STATIC answer.cpp)

#[[
message 可用于打印调试信息或错误信息,除了 STATUS
外还有 DEBUG WARNING SEND_ERROR FATAL_ERROR 等。
#]]
message(STATUS "Current source dir: ${CMAKE_CURRENT_SOURCE_DIR}")

#[[
给 libanswer 库目标添加 include 目录,PUBLIC 使
这个 include 目录能被外部使用者看到。

当链接 libanswer 库时,这里指定的 include 目录会被
自动添加到使用此库的 target 的 include 路径中。
CMAKE_CURRENT_SOURCE_DIR 表示当前 CmakeLists.txt 所在的目录;

PUBLIC 标志使得 头文件接口会被传递给依赖 libanswer 库的文件
#]]
target_include_directories(libanswer PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include)

使用系统安装的第三方库,以curl为例

#[[
find_package 用于在系统中寻找已经安装的第三方库的头文件和库文件
的位置,并创建一个名为 CURL::libcurl 的库目标,以供链接。
#]]
find_package(CURL REQUIRED)

add_library(libanswer STATIC answer.cpp)

target_include_directories(libanswer PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include)

#[[
为 libanswer 库链接 libcurl,这里 PRIVATE 和 PUBLIC 的区别是:
CURL::libcurl 库只会被 libanswer 看到,根级别的 main.cpp 中
无法 include curl 的头文件。
#]]
target_link_libraries(libanswer PRIVATE CURL::libcurl)

标签:cmake,libanswer,cpp,build,基础教程,answer,Cmake,include
From: https://www.cnblogs.com/zwyyy456/p/17479456.html

相关文章

  • Cmake之 target_include_directories
    target_include_directories是CMake中用于指定目标(target)的头文件搜索路径的命令。它的语法如下:target_include_directories(target[SYSTEM][BEFORE]<INTERFACE|PUBLIC|PRIVATE>[items1...][<INTERFACE|PUBLIC|PRIVATE>[items2...]...]) 其中,`t......
  • cmake设置gcc将shared library 改为生成 executeable
    前文ubuntu下,同一份代码,使用gcc和clang编译结果不相同。gcc编译结果,生成的程序为type为sharedlibary,而clang编译生成的程序的type为executeable.解决方案为cmakelists.txt脚本增加如下脚本set(CMAKE_CXX_FLAGS"-no-pie")set(CMAKE_C_FLAGS"-......
  • SQL基础教程(第二版)学习笔记(三)
    SQL基础教程(第二版)学习笔记(三)sanzk 工控笔记 2023-05-1700:26 发表于浙江收录于合集#数据库5个#SQL5个#PostgreSQL5个    用来管理数据库的计算机系统称为数据库管理系统(DBMS)DBMS种类: SQL语句及其种类 知识回顾://创建表,至少需要的语句CREAT......
  • CMake学习
    参考前言-《CMake菜谱(CMakeCookbook中文版)》-书栈网·BookStackTheArchitectureofOpenSourceApplications(Volume1)CMake(aosabook.org)CMakeReferenceDocumentation—CMake3.26.4DocumentationCMake从入门到精通-凌逆战-博客园(cnblogs.com)Ubun......
  • ubuntu 搭建 cmake + vscode 的 c/c++ 开发环境
    todo列表clang-formatc++整合软件安装略基本的环境搭建最基本的vscode插件只需要安装如下两个插件即可c/c++扩展是为了最基本的代码提示和调试支持cmakelanguagesupport是为了提示CMakeLists.txt脚本有可能安装了cmakelanguagesupport还是没有代码......
  • Makefile基础教程(伪目标)
    (文章目录)前言本篇文章将讲解Makefile中的伪目标,Makefile的目标在前面的文章中我们已经讲解了那么这篇文章我们就来讲讲伪目标。一、伪目标概念Makefile伪目标是一类特殊的目标,它们的目的是提供给make工具一些命令,而不是用来构建文件的。因为伪目标通常不会对应实际的文件......
  • Makefile基础教程(变量的高级主题,变量的拓展)
    (文章目录)前言本篇文章将给大家讲解一下变量的高级主题,变量的拓展,这些主题可以让你更加灵活地编写和维护Makefile。一、变量值的替换1.简单替换变量替换语法格式:$(var:a=b)其中,a可以是一个字母,表示var中每个单词结尾的这个字母。b则是替换的字符串。它会替换每个单......
  • 一次windows下使用cmake遇到的问题
    背景在windows下的cmake和mingw提供的make,在windows环境下进行了简单尝试,结果发现make的时候失败:#include<iostream>intmain(){std::cout<<"Hello,makefile."<<std::endl;return0;}CMakeList如下:project(test)add_executable(testtest.cpp)非常......
  • cmake
    cmake_minimum_required(VERSION3.4.1)##---指定cmake的最小版本set(TARGETwenet)##---将字符串wenet副给TARGETproject(${TARGET}CXX)##---指定工程名字,和语言,cxx代表c++set(CMAKE_CXX_STANDARD14)##---include(ExternalProject)##--CMAKE_SOURCE_DIR工程顶层目录include_d......
  • Makefile基础教程(自动生成依赖关系)
    @TOC前言在前面的文章中我们都只使用到了.c文件作为依赖但是在实际的工程中肯定是不可能只有.c文件的还存在.h文件,那么在包含了.h文件后又该如何来包含依赖关系呢?一、makefile不包含.h依赖的后果首先先在目录下新建四个文件夹,其中就包含了fun.h这个文件。makefile:OBJS:=fun.omai......