- Cmake实践学习(一)
- 一、初试 cmake – cmake 的 helloworld
- 1.准备工作
- 2.运行
- 3.CMakeLists.txt文件解释
- 二、构建Hello World工程
- 1.开始
- 参考:
一、初试 cmake – cmake 的 helloworld 1.准备工作
在 cmake 建立第一个练习目录 t1
cd /backup/cmake
mkdir t1
cd t1
在 t1 目录建立 main.cpp和 CMakeLists.txt(注意文件名大小写):
main.pp 文件内容:
代码如下:
#include
int main()
{
std::cout<<"Hello world from t1 Main!"<<std::endl;
return 0;
}
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})//不能直接用SRC_LIST 需要加上${}
2.运行
代码如下(示例)外部运行:
mkdir build//在t1工程下创建build文件夹
cd build //切换到build
cmake ..//对上级目录中的CMakeLists.txt进行cmake
make//对生成的makefile进行编译
这时候,我们需要的目标文件 hello 已经构建完成,位于当前目录,尝试运行一下
./hello
得到输出:Hello world from t1 Main!,如下所示
yy@yy:~/backup/cmake/t1/build$ cmake ..
CMake Warning (dev) at CMakeLists.txt:3:
Syntax Warning in cmake code at column 37
Argument not separated from preceding token by whitespace.
This warning is for project developers. Use -Wno-dev to suppress it.
CMake Warning (dev) at CMakeLists.txt:4:
Syntax Warning in cmake code at column 37
Argument not separated from preceding token by whitespace.
This warning is for project developers. Use -Wno-dev to suppress it.
-- This is BINARY dir /home/yy/backup/cmake/t1/build
-- This is SOURCE dir /home/yy/backup/cmake/t1
-- Configuring done
-- Generating done
-- Build files have been written to: /home/yy/backup/cmake/t1/build
yy@yy:~/backup/cmake/t1/build$ make
[100%] Built target hello
yy@yy:~/backup/cmake/t1/build$ ./hello
Hello world from t1 Main!
yy@yy:~/backup/cmake/t1/build$
3.CMakeLists.txt文件解释
PROJECT 指令的语法是:
PROJECT(projectname [CXX] [C] [Java])
你可以用这个指令定义工程名称,并可指定工程支持的语言,支持的语言列表是可以忽略的,
默认情况表示支持所有语言。这个指令隐式的定义了两个 cmake 变量_BINARY_DIR 以及_SOURCE_DIR,这里就是HELLO_BINARY_DIR 和 HELLO_SOURCE_DIR(所以 CMakeLists.txt 中两个 MESSAGE
指令可以直接使用了这两个变量), cmake 系统也帮助我们预定义了 PROJECT_BINARY_DIR 和 PROJECT_SOURCE_DIR
变量,他们的值分别跟 HELLO_BINARY_DIR 与 HELLO_SOURCE_DIR 一致。为了统一起见,建议以后直接使用 PROJECT_BINARY_DIR,PROJECT_SOURCE_DIR,即使修改了工程名称,也不会影响这两个变量。如果使用了
_SOURCE_DIR,修改工程名称后,需要同时修改这些变量。
SET 指令的语法是:
SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])
现阶段,你只需要了解 SET 指令可以用来显式的定义变量即可。
—
MESSAGE 指令的语法是:
MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] “message to display”…)
这个指令用于向终端输出用户定义的信息,包含了三种类型:
SEND_ERROR,产生错误,生成过程被跳过。
SATUS,输出前缀为—的信息
FATAL_ERROR,立即终止所有 cmake 过程.
我们在这里使用的是 STATUS 信息输出,演示了由 PROJECT 指令定义的两个隐式变量
HELLO_BINARY_DIR 和 HELLO_SOURCE_DIR。
ADD_EXECUTABLE(hello ${SRC_LIST})
定义了这个工程会生成一个文件名为 hello 的可执行文件,相关的源文件是 SRC_LIST 中定义的源文件列表,
本例我们使用了${}来引用变量,这是 cmake 的变量应用方式,但是,有一些例外,比
如在 IF 控制语句,变量是直接使用变量名引用,而不需来引用变量
**
二、构建Hello World工程任务:
1,为工程添加一个子目录 src,用来放置工程源代码;
2,添加一个子目录 doc,用来放置这个工程的文档 hello.txt
3,在工程目录添加文本文件 COPYRIGHT, README;
4,在工程目录添加一个 runhello.sh 脚本,用来调用 hello 二进制
4,将构建后的目标文件放入构建目录的 bin 子目录;
5,最终安装这些文件:将 hello 二进制与 runhello.sh 安装至/usr/bin,将 doc 目录
的内容以及 COPYRIGHT/README 安装到/usr/share/doc/cmake/t2。
在/backup/cmake/目录下建立 t2 目录。
将 t1 工程的 main.c 和 CMakeLists.txt 拷贝到 t2 目录中。
将main.cpp移动到src文件中
mkdir src
mv main.cpp src
结果如下图所示:
进入子目录 src,编写 CMakeLists.txt 如下:
ADD_EXECUTABLE(hello main.c)
将 t2 工程的 CMakeLists.txt 修改为:
PROJECT(HELLO)
ADD_SUBDIRECTORY(src bin)//添加一个子目录并构建该子目录 子目录下应该包含CMakeLists.txt文件和代码文件
详细介绍参考:Cmake命令之add_subdirectory介绍
然后在t2下建立 build 目录,进入 build 目录进行外部编译。
cmake ..
make
./build/bin/hello
输出:Hello world from t1 Main!
后半部分按照CMake实践中的来,最后整个结构如下图所示
cmake -DCMAKE_INSTALL_PREFIX=/tmp/t2/usr ..
然后运行
make
make install
参考:
**CMake实践
**Cmake命令之add_subdirectory介绍
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)