CMake实践(1)
简介:
目录结构t1/main.cpp; t1/CMakeLists.txt
说明:
main.cpp:
#include <stdio.h>
int main()
{
printf("Hello World from t1 Main!\n");
return 0;
}
CMakeLists.txt
#测试方法
#构建工程 :在t1目录下执行:cmake .
# 系统会自动生成:CMakeFiles, CMakeCache.txt, cmake_install.cmake等文件,并且生成了Makefile,
# 你可以不去理会这些文件,最关键的是它自动生成了Makefile
#实际构建: 在t1目录下执行:make
#
#COMMAND:PROJECT(projectname [CXX] [C] [Java])
#定义:定义工程名称,并可指定工程支持的语言(可忽略,默认情况支持所有语言)
#备注:这个指令隐式定义了2个cmake变量:<projectname>_BINARY_DIR, <projectname>_SOURCE_DIR
# 所以MESSAGE指令里可以直接用这2个变量,在内部编译下两者目录相同,均指向当前CMakelists.txt所在目录。
# 还帮我们预定义了另2个变量:PROJECT_BINARY_DIR(=<projectname>_BINARY_DIR),
# PROJECT_SOURCE_DIR(-<projectname>_SOURCE_DIR)
# 推荐使用后2个变量,即使修改了工程名称,也不会修改影响到这两个变量了。
PROJECT(HELLO)
#COMMAND:SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])
#定义:用来显式的定义变量
SET(SRC_LIST main.cpp)
#COMMAND:MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] "message to display"...)
#定义:向终端输出用户自定义的信息
# SEND_ERRO: 产生错误,生成过程被跳过
# STATUS: 输出前缀为-的信息
# FATAL_ERROR:立即终止所有cmake过程
MESSAGE(STATUS "This is BINARY dir" ${HELLO_BINARY_DIR})
MESSAGE(STATUS "This is SOURCE dir" ${HELLO_SOURCE_DIR})
#COMMAND:ADD_EXECUTABLE
#定义:定义工程生成的可执行文件,以及它所依赖的相关的源文件列表
ADD_EXECUTABLE(hello ${SRC_LIST})
#附:
#1)cmake基本语法规则
#1.1)变量使用${}方式取值,但是在IF控制语句中要直接使用变量名
#1.2)指令(参数1 参数2...)
# 参数用()括起来,参数之间用空格或分号分开
#1.3)指令是大小写无关,参数和变量是大小写相关的。推荐全部使用大写指令。
#2)语法相关
#SET(SRC_LIST main.c) == SET(SRC_LIST "main.c")
#SET(SRC_LIST fun nc.c) != SET(SRC_LIST "fun nc.c") :后者的""内的字符会被当成1个文件,
#3)内部编译vs外部编译
# 在CMakeLists.txt当前目录下执行"cmake .",属于内部编译
# 它生成的临时文件和工程文件在同一目录下,删除起来非常不方便
# 不在CMakeLists.txt当前目录下执行“cmake ../<path_to_CMakeLists_Dir> 属于外部编译
# 也就是out-of-source外部编译,所有动作全部发生在编译目录,对原有工程没有任何影响,推荐!!!
# 比如在t1目录下创建build目录,进到build目录下执行:"cmake ../", 此次编译过程便为外部编译
# 注:此时HELLO_SOURCE_DIR仍指工程路径:../cmake/t1(与CMakeLists.txt同级)
# HELLO_BINARY_DIR则指编译路径:../cmake/t1/build(与当前cmake执行命令所在的目录同级)
附:
外部编译结果:
-- 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
-- This is BINARY dir/home/sunjj/program/cmake_practice/t1/build
-- This is SOURCE dir/home/sunjj/program/cmake_practice/t1
-- Configuring done
-- Generating done
-- Build files have been written to: /home/sunjj/program/cmake_practice/t1/build
CMake实践(1)的更多相关文章
- 《CMake实践》笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE
<CMake实践>笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE <CMake实践>笔记二:INSTALL/CMAKE_INSTALL_PREFIX &l ...
- 《CMake实践》笔记二:INSTALL/CMAKE_INSTALL_PREFIX
<CMake实践>笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE <CMake实践>笔记二:INSTALL/CMAKE_INSTALL_PREFIX &l ...
- 《CMake实践》笔记三:构建静态库(.a) 与 动态库(.so) 及 如何使用外部共享库和头文件
<CMake实践>笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE <CMake实践>笔记二:INSTALL/CMAKE_INSTALL_PREFIX &l ...
- 《CMake实践》第三部分的示例代码的错误
<CMake实践>的第三章,初试cmake - cmake的helloworld 中的 PROJECT (HELLO) SET(SRC_LIST main.c) MESSAGE(statu ...
- CMake实践--操作
---<Cmake 实践>--- ---Ubuntu 14.04 1.创建一个cmake文件目录 mkdir -p ~/cmake 2.在cmake文件下创建t1子目录 cd ~/cmak ...
- 《CMake实践》笔记二:INSTALL/CMAKE_INSTALL_PREFIX【转】
本文转载自:http://www.cnblogs.com/52php/p/5681751.html 四.更好一点的Hello World 没有最好,只有更好 从本小节开始,后面所有的构建我们都将采用 ...
- 《CMake实践》笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE【转】
本文转载自:http://www.cnblogs.com/52php/p/5681745.html 前言: 开发了5,6年的时间,如果没有KDE4,也许不会有人或者Linux发行版本重视cmake,因 ...
- Cmake的介绍和使用 Cmake实践【转】
本文转载自:http://www.cppblog.com/Roger/archive/2011/11/17/160368.html Cmake的介绍和使用 Cmake实践 Cmake优点: 1. ...
- Cmake的介绍和使用 Cmake实践
Cmake的介绍和使用 Cmake实践http://www.cppblog.com/Roger/archive/2011/11/17/160368.html
- CMake实践(4)
一,本期目标: [sun@localhost t4]$ cat README 任务:如何使用外部共享库和文件 二,目录结构 [sun@localhost t4]$ tree ../t4../t4├── ...
随机推荐
- POJ 1915
#include<iostream> #include<stdio.h> #define MAXN 350 #include"queue" using na ...
- Javascript 电子时钟源码
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...
- hdu 1271 整数对
看了别人的解题报告a了, 大致思路就是 A=a+b*10^k+c*10^(k+1) B=a+c*10^k (在A中取出一位数后) N=A+B=2*a+b*10^k+11*c*10^k 这样就好做了,再 ...
- 毕向东JAVA视频讲解(四五课)
内存的划分: 1,寄存器. 2,本地方法区. 3,方法区. 4,栈内存. 存储的都是局部变量. 而且变量所属的作用域一旦结束,该变量就自动释放. 5,堆内存. 存储是数组和对象(其实数组就是对象) 凡 ...
- spring3.0的jar包详解
1. spring.jar 是包含有完整发布模块的单个jar 包. 2. org.springframework.aop 包含在应用中使用Spring的AOP特性时所需的类. 3. org.sprin ...
- Python中的SET集合操作
python的set和其他语言类似, 是一个无序不重复元素集, 基本功能包括关系测试和消除重复元素. 集合对象还支持union(联合), intersection(交), difference(差)和 ...
- python 字符串格式化 输出
1. 需要输出3列,为了输出好看,需要制定每一列的宽度: ‘%6.2f’ % 1.235 # 长度为6,保留2为小数 print '{0:20} {1:<20} {1:<20}\r\n'. ...
- SVN 目录结构
Subversion有一个很标准的目录结构,是这样的.比如项目是proj,svn地址为svn://proj/,那么标准的svn布局是 svn://proj/|+-trunk+-branches+-ta ...
- swift:自动引用计数ARC
Swift自动引用计数:ARC 原文链接:https://numbbbbb.gitbooks.io/-the-swift-programming-language-/content/chapte ...
- JDBC学习总结(一)
1.JDBC概述 JDBC是一种可以执行SQL语句并可返回结果的Java API,其全称是Java DataBase Connectivity,也是一套面向对象的应用程序接口API,它由一组用 ...