一,本期目标:

[~@localhost t2]$ cat README

this is README
├── CMakeLists.txt
├── COPYRIGHT
├── doc
│   └── hello.txt
├── README
├── runhello.sh
├── run.sh
└── src
    ├── CMakeLists.txt
    └── main.cpp

src/存放工程源代码
doc/存放工程文档
COPYRIGHT 工程版权信息
README    工程说明信息
runhello.sh 工程调用脚本

hello二进制与runhello.sh 安装到/<prefix>/bin
doc/目录中的hello.txt以及COPYRIGHT,README安装到/<prefix>/share/doc/cmake/t2

二,t2工程相关辅助文件:
[~@localhost t2]$ cat COPYRIGHT
this is COPYRIGHT
[~@localhost t2]$ cat doc/hello.txt
this is hello.txt
[~@localhost t2]$ cat runhello.sh
[~@localhost t2]$ cat run.sh
[~@localhost t2]$ cat src/main.cpp
#include <stdio.h>
int main()
{
    printf("Hello World from t2 Main!\n");

return 0;
}

三,t2工程相关CMake文件

[~@localhost t2]$ cat src/CMakeLists.txt
PROJECT(hello)

#标识此目录下的工程文件将会生成可执行二进制
ADD_EXECUTABLE(${PROJECT_NAME} main.cpp)

#设置最终文件的输出目录
#只是用于最终生成文件
#且此处目录指的是:当前CMakeLists.txt所在目录在编译路径同级目录下再创建子目录bin
#(可依据情况是否选择此功能)
#SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)

#设置最终文件的安装目录
INSTALL(TARGETS ${PROJECT_NAME}
        DESTINATION bin)

[~@localhost t2]$ cat CMakeLists.txt
#测试方法
#在t2/build目录下,执行"cmake -DCMAKE_INSTALL_PREFIX=//home/TOM/tmp .."
cmake_minimum_required(VERSION 2.6)
PROJECT(HELLO)

#COMMAND: ADD_SUBDIRECTORY(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
#定义:向当前工程添加存放源文件的子目录, 同时可以指定中间二进制和目标二进制存放的位置
#      EXCLUDE_FROM_ALL:将这个目录从编译过程中排除,
#      比如工程的example,可能就需要工程构建完成后,再进入example目录单独进行构建; 当然,你也可以通过定义依赖来解决此类问题
#      举例:ADD_SUBDIRECTORY(src bin)
#      将src子目录加入工程,并指定编译输出(包含编译中间结果)路径为bin目录。
#      如果不指定,编译结果(包括中间结果)都将存放在build/src目录(这个目录与原有的src目录对应),
#      指定bin目录后,相当于在编译时将src重命名为bin,所有编译结果都放在bin目录。
#     
ADD_SUBDIRECTORY(src bin)

#附:
#1)换个地方保存目标二进制
#    不论是SUBDIRS还是ADD_SUBDIRECTORY,我们都可以通过SET重新定义EXECUTABLE_OUTPUT_PATH和
#    LIBRARY_OUTPUT_PATH变量来指定最终的目标二进制的位置(指最终生成的hello或者最终的共享库,不含编译生成的是间文件)
#    SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
#    //只是用于最终生成文件
#    //且此处目录指的是:当前CMakeLists.txt所在目录在编译路径同级目录下再创建子目录bin
#    SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
#备注:
#   Q: 把上面两个指令放在哪里?
#   A: 在哪里ADD_EXECUTABLE或ADD_LIBRARY, 如果需要改变目标存放路径,就在那里使用这两个指令,这个例子当然指的是src下面的CMakeLists.txt

#3)如何安装
#    一般情况下会用到指令(INSTALL)和变量(CMAKE_INSTALL_PREFIX)
#COMMAND: INSTALL:
#定义:用于定义安装规则。 包括多种类型:有目标二进制,动态库,静态库,文件,目录和脚本等等
#3.1)目标文件的安装
#    INSTALL(TARGETS targets...
#            [ [ARCHIVE | LIBRARY |RUNTIME]
#              [DESTINATION <dir>]
#              [PERMISSIONS permissions ...]
#              [CONFIGURATIONS [Debug|Release|...]]
#              [COMPONENT <component>]
#              [OPTIONAL]
#            ] [...])
#     说明:TARGETS:
#                后面跟的就是我们通过ADD_EXECUTABLE或ADD_LIBRARY定义的目标文件,
#                可能是:可执行二进制(RUNTIME),动态库(LIBRARY),静态库(ARCHIVE)
#           DESTINATION:
#                定义安装的路径,${CMAKE_INSTALL_PREFIX}/<DESTINATION定义的路径>
#                如果DESTINATION以"/"开头,则指绝对路径,此时CMAKE_INSTALL_PREFIX无效
#                如果希望使用CMAKE_INSTALL_PREFIX来定义安装路径,就要写成相对路径,不以/开头
#                     
#     例子:INSTALL(TARGETS myrun mylib mystaticlib
#                   RUNTIME DESTINATION bin
#                   LIBRARY DESTINATION lib
#                   ARCHIVE DESTINATION libstatic
#                  )
#            解释:可执行二进制myrun安装到${CMAKE_INSTALL_PREFIX}/bin目录
#                  动态库mylib安装到${CMAKE_INSTALL_PREFIX}/lib目录
#                  静态库mystaticlib安装到${CMAKE_INSTALL_PREFIX}/libstatic目录
#                  (注:不需要关心TARGETS具体生成的路径,只要写上TARGETS名称就可以了)

#3.2)非目标文件的可执行程序安装(比如脚本这类)
#    INSTALL(PROGRAMS files...
#             DESTINATION <dir>
#             [以下参数与FILES相同,但默认权限是755])

#3.3)普通文件的安装
#    INSTALL(FILES file...
#            DESTINATION <dir>
#            [PERMISSIONS permissions...]
#            [CONFIGURATIONS [Debug|Release|...]]
#            [COMPONENT <component>]
#            [RENAME <name>] [OPTIONAL])
#    说明:用一安装一般文件,并可以指定访问权限,文件名是此指令所在路径下的树路径,默认权限644

#3.4)目录的安装
#    INSTALL(DIRECTORY dirs...
#            DESTINATION <dir>
#            [FILE_PERMISSIONS permissions...]
#            [DIRECTORY_PERMISSIONS permisssions...]
#            [USE_SOURCE_PERMISSIONS]
#            [CONFIGURATIONS [Debug|Release|...]]
#            [COMPONENT <component>]
#            [ [PATTERN <pattern> | REGEX <regex>] [EXCLUDE] [PERMISSIONS permissions...]]
#            [...] ]
#     说明:这里主要介绍DIRECTORY,PATTERN,PERMISSIONS参数
#           DIRECTORY: 后面接的是所在Source目录的相对路径,但要注意abc 和 abc/区别很大
#           前者的目录将被安装为目标路径下的abc,后者目录下的内容会被安装到目标路径下(不包含目录本身)
#           PATTERN: 用于正则静态式过滤
#           PERMISSIONS: 用于指定PATTERN过滤后的文件权限
#     例子:INSTALL(DIRECTORY icons scripts/
#                   DESTINATION share/myproj
#                   PATTERN "CVS" EXCLUDE
#                   PATTERN "scripts/*"
#                   PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ GROUP_EXECUTE GROUP_READ)
#      解释:将icons目录安装到<prefix>/share/myproj
#            将scripts/中的内容安装到<prefix>/share/myproj,
#            不包含目录名为CVS的目录,对于scripts/*文件指定权限为:OWNER_EXECUTE ......
#
#3.5) 安装CMAKE脚本的执行
#    INSTALL([[SCRIPT <file>] [CODE <code>] ] [...])
#    SCRIPT:用于在安装时调用cmake脚本文件(也就是<abc>.cmake文件)
#    CODE:   用于执行CMAKE命令,必须以双引号括起来,比如:
#    INSTALL(CODE "MESSAGE(\"Sample install message.\")")
#
        
#安装指令
INSTALL(FILES COPYRIGHT README
        DESTINATION share/doc/cmake/t2)

INSTALL(PROGRAMS runhello.sh run.sh
        DESTINATION bin)

INSTALL(DIRECTORY doc/
        DESTINATION share/doc/cmake/t2)

四,运行结果

[sun@localhost build]$ cmake -DCMAKE_INSTALL_PREFIX=./myproj ..
-- The C compiler identification is GNU
-- The CXX compiler identification is GNU
-- Check for working C compiler: /opt/gcc/bin/gcc
-- Check for working C compiler: /opt/gcc/bin/gcc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: /opt/gcc/bin/c++
-- Check for working CXX compiler: /opt/gcc/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/sun/program/cmake_practice/t2/build
[sun@localhost build]$ make
Scanning dependencies of target hello
[100%] Building CXX object src/CMakeFiles/hello.dir/main.cpp.o
Linking CXX executable hello
[100%] Built target hello
[sun@localhost build]$ make install
[100%] Built target hello
Install the project...
-- Install configuration: ""
-- Installing: /home/sun/program/cmake_practice/t2/build/myproj/share/doc/cmake/t2/COPYRIGHT
-- Installing: /home/sun/program/cmake_practice/t2/build/myproj/share/doc/cmake/t2/README
-- Installing: /home/sun/program/cmake_practice/t2/build/myproj/bin/runhello.sh
-- Installing: /home/sun/program/cmake_practice/t2/build/myproj/bin/run.sh
-- Installing: /home/sun/program/cmake_practice/t2/build/myproj/share/doc/cmake/t2
-- Installing: /home/sun/program/cmake_practice/t2/build/myproj/share/doc/cmake/t2/hello.txt
-- Installing: /home/sun/program/cmake_practice/t2/build/myproj/bin/hello
[sun@localhost build]$ tree myproj/
myproj/
├── bin
│   ├── hello
│   ├── runhello.sh
│   └── run.sh
└── share
    └── doc
        └── cmake
            └── t2
                ├── COPYRIGHT
                ├── hello.txt
                └── README

5 directories, 6 files

转载于:https://www.cnblogs.com/jacklikedogs/p/3779913.html

CMake实践(2)相关推荐

  1. 《CMake实践》笔记二:INSTALL/CMAKE_INSTALL_PREFIX

    <CMake实践>笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE <CMake实践>笔记二:INSTALL/CMAKE_INSTALL_PREFIX &l ...

  2. Cmake的介绍和使用 Cmake实践 - 吾尝终日而思矣 不如须臾之所学也 - C++博客

    Cmake的介绍和使用 Cmake实践 - 吾尝终日而思矣 不如须臾之所学也 - C++博客 Cmake的介绍和使用 Cmake实践 - 吾尝终日而思矣 不如须臾之所学也 - C++博客 Cmake的 ...

  3. cmake使用总结(转)---工程主目录CMakeList文件编写

    在linux 下进行开发很多人选择编写makefile 文件进行项目环境搭建,而makefile 文件依赖关系复杂,工作量很大,搞的人头很大.采用自动化的项目构建工具cmake 可以将程序员从复杂的m ...

  4. cmake could not find openssl_使用CMake构建C++项目

    背景 现代CMake如今开始转向使用targets和properties,比如下面文章介绍的这样: https://pabloariasal.github.io/2018/02/19/its-time ...

  5. android cmake 打印_Android NDK 开发:CMake 使用

    1. 前言 当在做 Android NDK 开发时,如果不熟悉用 CMake 来构建,读不懂 CMakeLists.txt 的配置脚本,很容易就会踩坑,遇到编译失败,一个很小的配置问题都会浪费很多时间 ...

  6. 【CMAKE系列】CMAKE外部工程引用及编译打印

    0.入门教程 CMAKE实践 参考网址:https://www.kancloud.cn/itfanr/cmake-practice/82983 1. ExternalProject 的使用 官网:ht ...

  7. CMake 常用总结二:CMake 生成静态库与动态库

    引言 CMake 实践帮助我们对 CMake 有一个系统全面的了解,并且有大量示例以供参考,至少在实际项目中可以让我们有能力看懂并修改项目中现有的 CMake . 阅读完 CMake 实践文档,认为自 ...

  8. 半闲居士视觉SLAM十四讲笔记(2)初识 SLAM- part 2 linux CMake、Kdevelop

    本系列文章由 youngpan1101 出品,转载请注明出处. 文章链接: http://blog.csdn.net/youngpan1101/article/details/71085778 作者: ...

  9. cmake 添加宏_cmake使用方法详解

    CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程).他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的 ...

  10. CMake 常用总结一:CMake 单个文件目录

    引言 CMake 实践帮助我们对 CMake 有一个系统全面的了解,并且有大量示例以供参考,至少在实际项目中可以让我们有能力看懂并修改项目中现有的 CMake . 阅读完 CMake 实践文档,认为自 ...

最新文章

  1. 北航机器人研究所 裴旭_三年亏损近29亿!北航硕士痴迷平衡车,让“中国智造”走向世界...
  2. pandas使用groupby函数、agg函数获取每个分组聚合对应的均值(mean)实战:计算分组聚合单数据列的均值、计算分组聚合多数据列的均值
  3. idea(三)最值得安装的几款插件
  4. 一个网友问的该不该加入公司Share Matching Plan
  5. 5训练需要更改参数吗_糖尿病病人需要多喝水吗?多喝水的5大好处,了解一下...
  6. RocketMQ源码解析-PushConsumer(2)
  7. Typora+PicGo+Gitee 图床配置
  8. 我发现有的人就活该他赚钱,他们的脑子就是个聚宝盆
  9. 安卓开源电子书 阅读器_4个适用于Android的开源电子书阅读器
  10. GRE阅读高频机经原文及题目之能源消费(逻辑)
  11. 51单片机教室人数进出统计检测LCD1602管显示装置红外传感器
  12. arm体系结构:arm920t
  13. 微信公众平台开发(111) 现金红包、裂变红包、企业付款
  14. [搬运]MATLAB newff函数训练模式
  15. 弗吉尼亚理工大学计算机科学,美国弗吉尼亚理工大学计算机科学本科.pdf
  16. 关于dcm4chee方面的问题,求各位英雄帮助,小女子感激不尽.... ...
  17. 计算机服务器安装系统安装教程,服务器如何安装系统,教您如何安装
  18. 小提琴统计图_小提琴图解读 - 统计学
  19. 使用lua配置neovim所需的一切
  20. python IO编程

热门文章

  1. python特性有什么_举例介绍Python中的25个隐藏特性
  2. java canvas画矩形,HTML5 编程之Canvas
  3. html里面布局的优劣,HTML与CSS布局技巧总结
  4. 小程序支付一定要后台服务器,2.字节跳动小程序支付配置
  5. 计算机信息与自然科学,郑旭飞 - 计算机与信息科学学院 - Powered by 西南大学
  6. NumPy库—random模块
  7. 2021-08-24XLNET 语言模型
  8. Ubuntu16.04安装python3.6
  9. java多线程(1)----多线程的概述
  10. mysql连接操作_MySQL内连接操作