学习camke为了大型的工程编译
预备知识:
1.Linux 基本命令:如 ls ,cd,vim ,apt或yum (不同Linux系统所使用的下载程序不同),cat等
2.Linux 下载cmake (一般自带)
3.c/c++形成可执行文件的过程
1. 单个源文件(初如cmake)
法一:
gcc -o main main.c
法二:
g++ -o main main.cpp
法三:
step1: 写一个.cpp文件 放入一个空文件夹下
step2: 在此文件夹下写CMakeLists.txt
#CMakeLists.txt
PROJECT(HELLO)
SET(SRC_LIST main.cpp)
MESSAGE(STATUS "This is BINARY dir" ${HELLO_SOURCE_DIR})
MESSAGE(STATUS "This is BINARY dir" ${HELLO_BINARY_DIR})
ADD_EXECUTABLE(hello ${SRC_LIST})
step3: 使用cmake 生成makefille文件
cmake .
在当前位置cmake(产生makeflie文件)
产生的文件:
step4 在当前文件位置编译makeflie
make
产生可执行文件 main
step5 执行可执行文件
./main
-----------------------------------------------------
cmake 语法介绍:
#CMakeLists.txt
PROJECT(HELLO)
SET(SRC_LIST main.cpp)
MESSAGE(STATUS "This is BINARY dir" ${HELLO_SOURCE_DIR})
MESSAGE(STATUS "This is BINARY dir" ${HELLO_BINARY_DIR})
ADD_EXECUTABLE(hello ${SRC_LIST})
PROJECT关键字 用来指定工程的名字 和支持的语言,默认支持所有语言。
PROJECT (HELLO) 指定工程名称为 HELLO
PROJECT(HELLO CXX)工程名为HELLO 并且支持c++
PROJECT(HELLO C CXX)工程名为HELLO 并且支持c和c++
该指定隐式定义了两个cmake变量 tips:<projectname>为项目名
<projectname>_BINARY_DIR 本例中为 HELLO_BINARY_DIR
<projectname>_SOURCCE_DIR 本例中为 HELLO_SOURCE_DIR
MESSAGE 关键字就可以直接使用这两个变量 当前都指向当前的工作目录,后面会讲外部编译
如果更改了工程名,这两个变量名也会改变
两个预定义变量 PROJECT_BINARY_DIR和PROJECT_SOURCCE_DIR 这两个变量与HELLO_SOURCE_DIR HELLO_BINARY_DIR一致
SET关键词
用来显示指定变量的
SET(SRC-LIST main.cpp ) SRC_LIST 变量包含了 main.cpp
也可以为SET(SRC_LIST main.cpp t1.cpp t2.cpp)
MESSAGE关键词
向终端输出自定义信息
包含三种
SEND_ERROR 产生错误 生成过程被跳过
SATUS 输出前缀唯一的信息
FATAL_ERROR 立即终止所有 cmake过程
如本例中这个关键词会输出
ADD_EXECUTABLE关键字
生成可执行文件
ADD_EXECUTABLE(hello ${SRC_LIST}) 生成可执行文件名为hello 源文件读取变量 SRC_LIST中的内容也可以直接写为ADD_EXECUTABLE(hello main.cpp)
上述例子可以简化为:
PROJECT(HELLO)
ADD_EXECUTABLE(hello main.cpp)
注意工程名HELLO与 可执行文件名hello 无关
语法的基本原则
变量使用${}方式取值 但在IF语句中是直接使用变量名
指令(参数1 参数2......)参数使用括弧扩起 参数之间使用空格 分号分开 以ADD_EXECUTABLE(hello main.cpp)为例
指令无关大小写 而变量 参数与大小写有关
推荐全部大写
语法注意
SET(SRC_LIST main.cpp)可以写为SET(SRC_LIST ”main.cpp“) 如果文件名有空格 必须要加“”
ADD_EXECUTABLE(hello main)后缀可不写 会自动寻找.c .cpp 尽量不要这么写
内部构建 和外部构建
上述为内部构件 产生临时文件多不便清理、
外部构建是把 cmake生成文件放入build文件夹中方便重新编译
2.