首页 > 其他分享 >CMake的基本使用

CMake的基本使用

时间:2023-01-02 20:22:49浏览次数:29  
标签:基本 src set CMake hello add build 使用 目录

本节内容的学习:基本掌握CMakeLists.txt文件的编写以及Makefile文件的构建

简介

CMake是一个跨平台的编译工具。

安装

  1. 在ubantu上使用apt install cmake命令进行安装
  2. 安装后使用cmake -version查看cmake的版本号

CMake的基本语法

1.PROJECT关键字
  1. 可以用来指定工程的名称和支持的语言,如果不指定语言,默认是支持所有语言的
    1. PROJECT(SERVER):指定了工程的名称,并支持所有语言
    2. PROJECT(SERVER CXX):指定了工程的名字,并且支持语言是C++
    3. PROJECT(SERVER CXX C):指定了工程的名字,并且支持语言是C++和C
  2. CMake中预定义的变量:
    1. PROJECT_BINARY_DIR:使用CMake构建输出的目录
    2. PROJECT_SOURCE_DIR:项目源码目录
2.SET关键字
  1. 可以用来为变量设置值,例如:SET(SRC_LIST main.cpp),SRC_LIST变量的值就包括main.cpp
3.MESSAGE关键字
  1. 可以用来向终端用户输出自定义的信息。主要包括三种信息:
    1. SEND_ERROR:产生错误,生成过程被跳过。
    2. SATUS:输出前缀为--的信息。
    3. FATAL_ERROR:将会终止CMake构建过程
4.ADD_EXECUTABLE关键字
  1. 用于指定生成可执行文件的名称,例如:ADD_EXECUTABLE(server ${SRC_LIST})
5.ADD_SUBDIRECTORY关键字
  1. 用于向当前工程添加存放源文件的子目录,并可以指定中间二进制和目标二进制存放的位置
  2. 语法格式为:ADD_SUBDIRECTORY(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
    1. source_dir:指定向当前工程添加存放源文件的子目录
    2. binary_dir:指定CMake构建过程中中间二进制和目标二进制存放的位置
  3. 使用示例:
    1. 项目目录为:

    2. 项目根目录下的CMakeLists.txt内容为:

    project(test2)
    # 向当前工程加入src目录,并指定构建的输出目录为bin(如果在test2/build目录下执行cmake ..)
    # 则输出目录为build/bin
    add_subdirectory(src bin)
    
    1. 源码目录src下的CMakeLists.txt内容为:
    set(src_list main.cpp)
    add_executable(target ${src_list})
    
    1. 在build目录下执行cmake ..,即可在build目录下产生Makefile
6.ADD_LIBRARY关键字
  1. 用来构建动态库或者静态库。
  2. 语法示例:ADD_LIBRARY(库名称 SHARED|STATIC ${LIBHELLO_SRC})
    1. SHARED:指定构建的是动态库
    2. STATIC:指定构建的是静态库
    3. ${LIBHELLO_SRC}指定构建库所需要的源文件
7.INSTALL关键字
  1. 使用INSTALL关键字可以用来安装二进制文件、动态库、静态库、文件、目录、脚本等
  2. CMAKE中预定义的变量:CMAKE_INSTALL_PREFIX,其值默认为 /usr/local/
  3. 该指令的使用示例:
    1. 项目目录如下:

    2. 项目根目录下的CMakeLists.txt内容为:

    project(test3)
    add_subdirectory(src bin)
    # 安装文件COPYRIGHT和README
    install(FILES COPYRIGHT README DESTINATION share/cmake/)
    # 安装脚本test3.sh
    install(PROGRAMS test3.sh DESTINATION share/bin)
    # 安装目录,安装doc目录下的所有内容
    install(DIRECTORY doc/ DESTINATION share/doc)
    
    
    1. 在build目录下执行cmake ..即可在build目录下产生Makefile
    2. make
    3. 安装:make install,即可在${CMAKE_INSTALL_PREFIX}/<DESTINATION 定义的路径>查看安装的内容
  1. 用来添加需要链接的共享库
9.基本语法规则
  1. 变量取值:使用${变量名称}
  2. 指令的参数之间使用空格或者分号分隔,例如
add_executable(fileserver ${net_srcs} ${fileserver_srcs} ${utils_srcs})
  1. 指令名称大小写无关,例如ADD_EXECUTABLE和add_executable都行的

简单示例

  1. 在项目的指定目录下构建:
    1. 在项目根目录下新建build目录
    2. 在build目录下执行cmake ..(CMakeLists.txt文件在项目根目录下),这样cmake产生的文件就会存放在build目录下

CMake构建静态库和动态库

  1. 静态库和动态库的区别:
    1. 静态库的扩展名一般为.a或者.lib,动态库的扩展名一般为.dll或者.so。
    2. 静态库在编译时会直接整合到目标程序中,编译成功的可执行文件可独立运行
    3. 动态库在编译时不会放到目标程序中,即可执行文件无法单独运行。它需要在运行时进行链接动态库
  2. 使用CMAKE单独构建静态库或者动态库示例:
    1. 项目目录如下:

    2. 项目根目录下的CMakeLists.txt内容为:

    project(test4)
    add_subdirectory(lib bin)
    
    1. 源码目录src下的CMakeLists.txt内容为:
    set(libhello_src hello.cpp)
    add_library(hello SHARED ${libhello_src})
    
    1. 在build目录下执行cmake ..即可在build目录下产生Makefile
    2. 执行make即可产生动态库libhello.so
  3. 静态库和动态库的同时构建
set(libhello_src hello.cpp)
# 构建静态库
add_library(hello_static STATIC ${libhello_src})
# 对hello_static进行重命名为hello
set_target_properties(hello_static PROPERTIES OUTPUT_NAME "hello")
# 清理掉hello_static这个库
set_target_properties(hello_static PROPERTIES CLEAN_DIRECT_OUTPUT 1)
add_library(hello SHARED ${libhello_src})
set_target_properties(hello PROPERTIES  OUTPUT_NAME "hello")
set_target_properties(hello PROPERTIES CLEAN_DIRECT_OUTPUT 1)
  1. 安装共享库和头文件:示例将hello这个共享库安装到${CMAKE_INSTALL_PREFIX}/lib目录下,将头文件hello.h安装到${CMAKE_INSTALL_PREFIX}/include/hello目录下,完整示例如下:

    1. 项目目录如下:

    2. 项目根目录下的CMakeLists.txt内容为:

    project(test4)
    add_subdirectory(lib bin)
    
    1. 源码目录src下的CMakeLists.txt内容为:
    set(libhello_src hello.cpp)
    # 构建静态库
    add_library(hello_static STATIC ${libhello_src})
    # 对hello_static进行重命名为hello
    set_target_properties(hello_static PROPERTIES OUTPUT_NAME "hello")
    set_target_properties(hello_static PROPERTIES CLEAN_DIRECT_OUTPUT 1)
    add_library(hello SHARED ${libhello_src})
    set_target_properties(hello PROPERTIES  OUTPUT_NAME "hello")
    set_target_properties(hello PROPERTIES CLEAN_DIRECT_OUTPUT 1)
    
    # 将头文件hello.h放到${CMAKE_INSTALL_PREFIX}/include/hello目录下
    install(FILES hello.h DESTINATION include/hello)
    # 二进制、静态库、动态库安装的第一个参数都使用TARGETS
    # ARCHIVE指的是静态库
    # LIBRARY指的是动态库
    install(TARGETS hello hello_static LIBRARY DESTINATION lib ARCHIVE DESTINATION lib)
    
    1. 在build目录下执行cmake ..即可在build目录下产生Makefile
    2. 执行make即可产生动态库libhello.so和静态库libhello.a
    3. 安装:
  2. 共享库和头文件的使用,示例如下

    1. 项目目录如下:

    2. main.cpp内容如下:

    #include <hello.h>
    
    int main() {
        // 调用动态库中的函数
        func();
    }
    
    1. 项目根目录下的CMakeLists.txt内容为:
    project(test5)
    # 加入头文件搜索路径
    include_directories(/usr/local/include/hello)
    # 添加非标准的共享库搜索路径
    link_directories(/usr/local/lib)
    add_subdirectory(src bin)
    
    1. 源码目录src下的CMakeLists.txt内容为:
    set(src_list main.cpp)
    add_executable(target ${src_list})
    # 添加需要链接的共享库
    target_link_libraries(target libhello.so)
    
    1. 在build目录下执行cmake ..即可在build目录下产生Makefile
    2. 执行make即可生成目标可执行文件

标签:基本,src,set,CMake,hello,add,build,使用,目录
From: https://www.cnblogs.com/xiaocer/p/17020442.html

相关文章

  • Linux基础命令 ls 的使用
    ls作用是:显示指定目录下的文件和属性信息。我列出几种常用的 以上我写了三条命令,还有很多选项感兴趣的可以通过  https://www.linuxcool.com/ls 去查看了解第......
  • Antd(Ant Design)使用时遇到的问题记录
    antd的Table组件实现自定义分页数据条数在Table组件上的pagination属性上可以实现自定义分页数据条数<TabledataSource={dataSource}columns={columns}pagina......
  • 轻松解决企业数据高延时,华为云全球加速GA使用更灵活!
    轻松解决企业数据高延时,华为云全球加速GA使用更灵活!对于业务庞大且分布地区较为分散的企业来说,常常会出现访问总部的公司数据延时高、速率低等问题,从而降低了工作效率,增加了......
  • 使用Axios设置请求头(headers)
    使用Axios设置请求头(headers)参考自:使用Axios来设置请求头(headers)的方法get请求axios.get(url,config).then(res=>console.log(res)).catch(err=>console.log(e......
  • python 使用 VSCode 入门简介
    本文主要介绍如何使用VSCode创建、编辑、运行、调试hello.py程序,对如何安装使用python不做介绍,也不对安装vscode介绍。准备事项电脑安装python3,vscode,并安装v......
  • Redis 中ZSET数据类型命令使用及对应场景总结
    转载请注明出处:目录1.zadd添加元素2.zrem从有序集合key中删除元素3.zscore返回有序集合key中元素member的分值4.zincrby为......
  • feishu2md的使用
    Feishu2Md这是一个下载飞书文档为Markdown文件的工具,使用Go语言实现。使用于2023年1月,补充github官方仓库里的README文档备查如何使用借助Go语言跨平台的特性,已......
  • certbot简单使用
    ssl一直用的是阿里的免费证书,但是每年需要定时更换证书,而且数量上也有限制,这就很烦,我这么懒,别说一年一换,就是两年一换证书我都懒得打开后台~科普为了加快推广https的普......
  • 使用Alist白嫖百度一刻相册无限空间图床
    注意文中所示软件功能均为免费(截至文章发布日期)请珍惜免费软件,来之不易:Replit提供免费Docker服务,因此,在上传图片的时候,尽量在百度一刻相册客户端内上传(如果是能重定向......
  • 2.4 基本数据类型
    2.4基本数据类型基本数据类型包括:整型浮点型布尔类型字符串以上四种数据类型在几乎所有的编程语言中都支持2.4.1整型计算机基础科普字节(Byte):计算机中数据......