CMake的helloWorld(二)外部构建

版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/hjxu2016/article/details/83054310

学习一:CMake的hello world(一)使用CMake

本系列都是学习<CMake实践>这本书,书下载链接

https://download.csdn.net/download/hjxu2016/10741464

继续上次学习内容,往后

前面提到使用CMake,我们发现,在当前目录下生成了很多看不懂的文件,我尝试运行 make distclean用来清理构建过程中产生的中间文件,但是是无效的,CMake不支持 make distclean, 看到这么多复杂的中间文件, 相信是个程序员都不想再使用内部构建了.

这次简单记录一个CMake外部构建

mkdir build
cd build
cmake .. #..代表父目录,.因为父目录存在我们需要的CMakeLists.txt文件
make

就会发现,build文件夹下出现中间文件啦.

那么,如何让我们的HelloWorld更像一个工程呢?

我们的任务如下:

1、为工程添加一个子目录src,用来放置工程源代码

2、添加一个子目录 doc,用来放置这个工程的文档 hello.txt

3、在工程目录添加文本文件 COPURIGHT, README

4、在工程目录添加一个runhello.sh脚本,用来调用hello二进制

5、将构建后的目标文件放入构建目录的bin子目录

6、最终安装这些文件:将hello 二进制与runhello.sh安装到 /usr/bin,将doc目录的内容以及 COPYRIGHT/README安装到 /usr/share/doc/cmake/t2

开始:

首先建立 t2目录, 将t1工程中的main.cpp 和CMakeLists.txt拷贝到t2中,然后添加子目录src,将main.cpp移动到src中,.

注意:我们需要为任何的子目录建立一个CMakeLists.txt, 编写内容如下

ADD_EXECUTABLE(hello main.cpp)

然后将t2目录下的CMakeLists.txt修改为

PROJECT (HELLO)
ADD_SUBDIRECTORY(src bin)
# ADD_SUBDIRECTORY(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
# 这个指令用于向当前工程添加存放源文件的子目录, 并可以指定中间二进制和目标二进制存放的位置.
# EXCLUDE_FROM_ALL 参数的含义是将这个目录从编译过程中排除,
# 比如工程的example, 可能就需要工程构建完成后,再进入example目录单独进行构建
# 

然后建立build,这时候tree目录结构如下

├── build
├── CMakeLists.txt
├── CMakeLists.txt~
└── src
    ├── CMakeLists.txt
    └── main.cpp

然后老规矩:

cd build
cmake ..
make

构建完成后,发现,生成的目标文件 hello位于build/bin目录中,

接下来,修改helloWorld修改安装,有点懒,直接复制粘贴了

1,为工程添加一个子目录 src,用来存储源代码;
2,添加一个子目录 doc,用来存储这个工程的文档 hello.txt
3,在工程目录添加文本文件 COPYRIGHT, README;
4,在工程目录添加一个 runhello.sh 脚本,用来调用 hello 二进制
4,将构建后的目标文件放入构建目录的 bin 子目录;
5,最终安装这些文件:将 hello 二进制与 runhello.sh 安装至/<prefix>/bin,将
doc 目录中的 hello.txt 以及 COPYRIGHT/README 安装到
/<prefix>/share/doc/cmake/t2,将
首先我们先补上为添加的文件。
添加 doc 目录及文件:
cd /backup/cmake/t2
mkdir doc
vi doc/hello.txt
随便填写一些内容并保存
在工程目录添加 runhello.sh 脚本,内容为:
hello
添加工程目录中的 COPYRIGHT 和 README
touch COPYRIGHT
touch README
下面改写各目录的 CMakeLists.txt 文件。
1,安装 COPYRIGHT/README,直接修改主工程文件 CMakelists.txt,加入以下指令:
INSTALL(FILES COPYRIGHT README DESTINATION share/doc/cmake/t2)
2,安装 runhello.sh,直接修改主工程文件 CMakeLists.txt,加入如下指令:
INSTALL(PROGRAMS runhello.sh DESTINATION bin)
3,安装 doc 中的 hello.txt,这里有两种方式:一是通过在 doc 目录建立
CMakeLists.txt 并将 doc 目录通过 ADD_SUBDIRECTORY 加入工程来完成。另一种方法
是直接在工程目录通过
INSTALL(DIRECTORY 来完成),前者比较简单,各位可以根据兴趣自己完成,我们来尝试
后者,顺便演示以下 DIRECTORY 的安装。
因为 hello.txt 要安装到/<prefix>/share/doc/cmake/t2,所以我们不能直接安装
整个 doc 目录,这里采用的方式是安装 doc 目录中的内容,也就是使用”doc/”
在工程文件中添加
INSTALL(DIRECTORY doc/ DESTINATION share/doc/cmake/t2)
6,尝试我们修改的结果:
现在进入 build 目录进行外部编译,注意使用 CMAKE_INSTALL_PREFIX 参数,这里我们
将它安装到了/tmp/t2 目录:
cmake -DCMAKE_INSTALL_PREFIX=/tmp/t2/usr ..
然后运行
make
make install
让我们进入/tmp/t2 目录看一下安装结果:
./usr
./usr/share
./usr/share/doc
./usr/share/doc/cmake
./usr/share/doc/cmake/t2
./usr/share/doc/cmake/t2/hello.txt
./usr/share/doc/cmake/t2/README
./usr/share/doc/cmake/t2/COPYRIGHT
./usr/bin
./usr/bin/hello
./usr/bin/runhello.sh
如果你要直接安装到系统,可以使用如下指令:
cmake -DCMAKE_INSTALL_PREFIX=/usr ..
7,一个疑问
如果我没有定义 CMAKE_INSTALL_PREFIX 会安装到什么地方?
你可以尝试以下,cmake ..;make;make install,你会发现
CMAKE_INSTALL_PREFIX 的默认定义是/usr/local
 

猜你喜欢

转载自blog.csdn.net/hjxu2016/article/details/83054310