Cmake实践学习(一)

Cmake实践学习(一),第1张

Cmake实践学习(一)

文章目录
  • 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 目录。

1.开始

将 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介绍

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1329819.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-12
下一篇 2022-06-12

发表评论

登录后才能评论

评论列表(0条)

保存