cmake的定义是什么 ?—–⾼级编译配置⼯具
当多个⼈⽤不同的语⾔或者编译器开发⼀个项⽬,最终要输出⼀个可执⾏⽂件或者共享库(dll,so等等)这时候神
器就出现了—–CMake!
所有操作都是通过编译CMakeLists.txt来完成的—简单
CMake⼀个HelloWord
- 步骤一 写一个HelloWorld
#main.cpp
#include <iostream>
int main(){
std::cout << "hello word" << std::endl;
}
- 步骤二 写CmakeLists.txt
#CMakeLists.txt
PROJECT (HELLO)
SET(SRC_LIST main.cpp)
MESSAGE(STATUS "This is BINARY dir " ${HELLO_BINARY_DIR})
MESSAGE(STATUS "This is SOURCE dir "${HELLO_SOURCE_DIR})
ADD_EXECUTABLE(hello ${SRC_LIST})
- 步骤三 使用cmake, 生成makefile 文件
cmake .
输出:
[root@localhost cmake]# cmake .
CMake Warning (dev) in CMakeLists.txt:
Syntax Warning in cmake code at
/root/cmake/CMakeLists.txt:7:37
Argument not separated from preceding token by whitespace.
This warning is for project developers. Use -Wno-dev to suppress it.
-- The C compiler identification is GNU 10.2.1
-- The CXX compiler identification is GNU 10.2.1
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- This is BINARY dir /root/cmake
-- This is SOURCE dir /root/cmake
-- Configuring done
-- Generating done
-- Build files have been written to: /root/cmake
⽬录下就⽣成了这些⽂件-CMakeFiles, CMakeCache.txt, cmake_install.cmake 等⽂件,并且⽣成了Makefile. 现在
不需要理会这些⽂件的作⽤,以后你也可以不去理会。最关键的是,它⾃动⽣成了Makefile.
- 使用make 命令编译
root@localhost cmake]# make
Scanning dependencies of target hello
[100%] Building CXX object CMakeFiles/hello.dir/main.cpp.o
Linking CXX executable hello
[100%] Built target hello
5、最终⽣成了Hello的可执⾏程序
CMake⼀个HelloWord-的语法介绍
PROJECT关键字
可以⽤来指定⼯程的名字和⽀持的语⾔,默认⽀持所有语⾔
PROJECT (HELLO) 指定了⼯程的名字,并且⽀持所有语⾔—建议
PROJECT (HELLO CXX) 指定了⼯程的名字,并且⽀持语⾔是C++
PROJECT (HELLO C CXX) 指定了⼯程的名字,并且⽀持语⾔是C和C++
该指定隐式定义了两个CMAKE的变量
_BINARY_DIR,本例中是 HELLO_BINARY_DIR
_SOURCE_DIR,本例中是 HELLO_SOURCE_DIR
MESSAGE关键字就可以直接使⽤者两个变量,当前都指向当前的⼯作⽬录,后⾯会讲外部编译
问题:如果改了⼯程名,这两个变量名也会改变
解决:⼜定义两个预定义变量:PROJECT_BINARY_DIR和PROJECT_SOURCE_DIR,这两个变量和
HELLO_BINARY_DIR,HELLO_SOURCE_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 指令
为例,如果存在另外⼀个 func.cpp 源⽂件
就要写成:ADD_EXECUTABLE(hello main.cpp func.cpp)或者ADD_EXECUTABLE(hello main.cpp;func.cpp) - 指令是⼤⼩写⽆关的,参数和变量是⼤⼩写相关的。但,推荐你全部使⽤⼤写指令
语法注意事项
- SET(SRC_LIST main.cpp) 可以写成 SET(SRC_LIST “main.cpp”),如果源⽂件名中含有空格,就必须要加双引
号 - ADD_EXECUTABLE(hello main) 后缀可以不⾏,他会⾃动去找.c和.cpp,最好不要这样写,可能会有这两个文件main.cpp和main
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/76868.html