cmake知识点总结

2023-11-12

  CMake的所有的语句都写在一个叫 CMakeLists.txt 的文件中。当 CMakeLists.txt 文件确定后,可以用 ccmake 命令对相关的变量值进行配置。这个命令必须指向 CMakeLists.txt 所在的目录。配置完成之后,应用 cmake 命令生成相应的 makefile。

一、项目的目录结构

  • src:源文件
  • inc:头文件
  • test:测试文件,主函数入口
  • proto:proto文件
  • log:项目产生的日志文件
  • build:在此文件夹中构建项目,不污染源文件
  • bin:生成的可执行文件
  • build.sh:cmake的脚本

二、实例说明Cmake编写规则

  src文件下的CMakeLists.txt

# 指定CMake编译最低要求版本
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)

# 将C++文件赋值给变量SRC_LIST_Server
SET(SRC_LIST_Server 
    ChatServer.cpp 
    ChatSystem.pb.cc 
    ChatStatus.pb.cc 
    Mysql.cpp 
    Redis.cpp
)
SET(SRC_LIST_Client 
    ChatClient.cpp 
    ChatSystem.pb.cc 
    ChatStatus.pb.cc 
    Mysql.cpp 
    Redis.cpp
)

# 设置编译选项
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -lpthread -g -Wall")

# 查找protobuf头文件
# find_package(Protobuf REQUIRED)
# if(PROTOBUF_FOUND)
#   message(STATUS "protobuf library found")
# else()
#    message(FATAL_ERROR "protobuf library is needed but cant be found")
# endif()
#include_directories(${PROTOBUF_INCLUDE_DIRS})

# 指定头文件和库文件目录
INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/inc)
# 指定生成库文件的目录
SET(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)

INCLUDE_DIRECTORIES(/usr/local/include/google/protobuf)
INCLUDE_DIRECTORIES(/usr/local/boost/include)
INCLUDE_DIRECTORIES(/usr/include/mysql)
INCLUDE_DIRECTORIES(/usr/local/include/hiredis)
INCLUDE_DIRECTORIES(/usr/local/include/glog)

LINK_DIRECTORIES(/usr/local/boost/lib)

# 生成库文件,默认生成静态库,SHARED指定生成库类型为动态库
ADD_LIBRARY(chatserver SHARED ${SRC_LIST_Server})
ADD_LIBRARY(chatclient SHARED ${SRC_LIST_Client})

# 需要链接的库文件
TARGET_LINK_LIBRARIES(chatserver
                      protobuf
                      hiredis
                      mysqlclient
                      glog
)
TARGET_LINK_LIBRARIES(chatclient
                      protobuf
                      hiredis
                      mysqlclient
                      glog
)

  test文件下的CMakeLists.txt

# 指定CMake编译最低要求版本
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)

# 将Server.cpp赋值给Server变量
SET(Server Server.cpp)
SET(Client Client.cpp)

# 设置编译选项
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -lpthread -g -Wall")

# 设置生成的执行文件的输出目录
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)

LINK_DIRECTORIES(${PROJECT_SOURCE_DIR}/lib)

INCLUDE_DIRECTORIES(/usr/local/include/google/protobuf)
INCLUDE_DIRECTORIES(/usr/local/boost/include)
INCLUDE_DIRECTORIES(/usr/include/mysql)
INCLUDE_DIRECTORIES(/usr/local/include/hiredis)
INCLUDE_DIRECTORIES(/usr/local/include/glog)
LINK_DIRECTORIES(/usr/local/boost/lib)

# 生成可执行文件server,依赖于Server.cpp
ADD_EXECUTABLE(server ${Server})
ADD_EXECUTABLE(client ${Client})

# 指定server的链接库chatserver和protobuf
TARGET_LINK_LIBRARIES(server chatserver)
TARGET_LINK_LIBRARIES(client chatclient)

【指令说明】:

  • CMAKE_MINIMUM_REQUIRED:声明Cmake版本,如果低于指定版本则会停止处理工程文件,并报告错误。
  • SET:定义变量并赋值。
  • CMAKE_CXX_FLAGS:设置编译选项。
  • PROJECT_SOURCE_DIR:预定义的变量。
  • ${}:取值。
  • INCLUDE_DIRECTORIES:向工程添加多个特定的头文件搜索路径,路径之间用空格分隔。
  • LINK_DIRECTORIES:添加非标准的共享库搜索路径。
  • ADD_LIBRARY:生成动态库或静态库。
  • TARGET_LINK_LIBRARIES:为TARGET添加需要链接的共享库。
  • ADD_EXECUTABLE:生成可执行文件。

【运行说明】:

#!bin/bash

protoc -I=./proto/ --cpp_out=./proto ./proto/ChatSystem.proto
mv ./proto/ChatSystem.pb.h ./inc/ChatSystem.pb.h
mv ./proto/ChatSystem.pb.cc ./src/ChatSystem.pb.cc

if [ ! -e ./build ]
then 
    mkdir build
else 
    rm -rf build/*
fi

if [ ! -e ./bin ]
then  mkdir bin
else rm -rf bin/*
fi

if [ ! -e ./log ]
then  mkdir log
else rm -rf log/*
fi

if [ ! -e ./lib ]
then  mkdir lib
else rm -rf lib/*
fi

cd build
cmake ..
make

参考:https://github.com/carl-wang-cn/demo/tree/master/cmake
https://www.cnblogs.com/flyinggod/archive/2017/11/08/7805587.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

cmake知识点总结 的相关文章

随机推荐

  • JS HTML CSS 前端页面生成电脑桌面壁纸?(动态可交互)

    1 先看效果 2 设计网页 你们可以自己设计网页或者去网上找好的网页 甚至可以直接用百度放到桌面是可以搜索的 自己写的网页可以放服务器也可以本地 本地连接后无法编辑 3 下载应用 电脑左下角搜索 Lively 点上面应用 然后进入Micro
  • Tkinter界面动态显示变化数值

    例举字符串StringVar 和整型IntVar var tk StringVar 或 var tk IntVar var set 设置 var get 获取 1 整型IntVaVar IntVar 要配合控件便使用 import tkin
  • 如何给C盘扩容?不用软件,把其他盘的空间分给C盘即可(图文详解)

    目录 1 打开磁盘管理器 2 将其他盘分盘 3 扩容 1 打开磁盘管理器 此电脑 gt 管理 gt 磁盘管理 2 将其他盘分盘 压缩卷 3 扩容 1 将与C盘邻近的分盘删除 注 给一个盘扩容 只能将这个盘后一个盘的空间分给它 2 C盘扩展卷
  • 小米主题显示服务器不可用,小米主题商店 小米主题怎么混搭

    小米主题商店中有非常多种类齐全的主题可以下载 无论是免费的还是收费的都是有一堆 不过一些刚刚买小米手机的用户还不清楚小米主题要怎么进行混搭 所以今天就来为大家详细的介绍一下小米主题商店中进行混搭主题的教程 小米主题商店 小米主题怎么混搭 1
  • JAVA 通过浏览器下载大文件导致OOM

    背景 Response 获取的对象为 ContentCachingResponseWrapper 页面点击下载文件 后台报错如下 org springframework web util NestedServletException Han
  • 关于oss使用sts 后台签发临时token前端直传大文件的错误记录

    文章目录 前言 遇到的问题 1 NoSuchBucket The specified bucket does not exist 2 com aliyuncs exceptions ClientException InvalidParame
  • tp5的分页方法 paginate

    tp5的分页方法paginate 一共有三个参数 其中 listRows可以为整型或者数组 当是数组的时候 你传入的 config就会失效 原因是 paginate的源代码 所以说 如果你想重新配置参数 那 listRows就传数组 否则的
  • 【ffmpeg基础】视频滤波处理

    ffmpeg版本 ffmpeg version 5 1 2 Copyright c 2000 2022 the FFmpeg developers 一 视频缩放滤波器 视频的滤波器通常使用 vf video filters 来设置滤波器 也
  • GDI 绘图

    目录 GDI 绘图 画点 画线 画封闭图形 画笔 画刷 其他 DC Device Context 绘图设备 HDC 绘图设备句柄 GDI Microsoft Graphics Device Interface Win32提供的绘图API G
  • python变量与作用域

    变量从作用域分类 作用范围从小到大为 小作用域的可以调用大作用域的内容 局部 Local 闭包 Enclosing 全局 Global 内建 Build in 局部变量 局部变量是定义在函数中的 因此其作用域是在函数内部 def examp
  • Opencv2.4.2+vs2008+windowsXP(32位)安装过程

    Opencv2 4 2 vs2008 windowsXP 32位 安装过程 准备软件 opencv2 4 2 VS2008软件 1 解压opencv2 4 2到指定路径 例如 D Program Files OpenCV2 4 2 2 打开
  • Https + OPENSSL

    二 HTTPS 2 1 HTTPS介绍 先来看HTTPS的概念 我们一般的http走的是80端口 而https走的是443端口 有什么不一样的地方吗 很简单 我们拿个telnet命令来作个实验 telnet127 0 0 1 80 直接就登
  • Vue.js(四)

    Vue js 模板语法 Vue js 使用了基于 HTML 的模版语法 允许开发者声明式地将 DOM 绑定至底层 Vue 实例的数据 Vue js 的核心是一个允许你采用简洁的模板语法来声明式的将数据渲染进 DOM 的系统 结合响应系统 在
  • two.js插件的简单用法

    div div
  • linux 环境变量设置方法总结(PATH/LD_LIBRARY_PATH)

    PATH和LD LIBRARY PATH本质都是变量 所谓变量的意思就是由别人赋值产生的 直觉往往会让我们添加和减少这个变量本身的某些路径 实际上这是不正确的 正确的做法是我们要去修改赋予这个变量数值的那些配置文件 加一条路径或者减一条 说
  • pageoffice 骑缝章_PageOffice 页面中打开office编辑文档

    pom xml com zhuozhengsoft pageoffice 4 5 0 6 web xml poserver com zhuozhengsoft pageoffice poserver Server poserver pose
  • FDFS_Ubuntu部署fdfs测试上传文件不成功

    开启服务 sudo service fdfs trackerd start sudo service fdfs storaged start 查看服务是否开启 ps aux grep fdfs 执行完上述的操作之后 在ps 命令中完美显示开
  • 字符串相关,可变长字符串,异常

    字符串相关 String 字符串常量 本质char String str1 abc String str2 abc System out prrintln str1 str2 同时也会带来这样的问题 String a a a a b ab
  • Vue axios的使用

  • cmake知识点总结

    CMake的所有的语句都写在一个叫 CMakeLists txt 的文件中 当 CMakeLists txt 文件确定后 可以用 ccmake 命令对相关的变量值进行配置 这个命令必须指向 CMakeLists txt 所在的目录 配置完成