让前面的Hello World更像一个工程:
- 为工程添加一个子目录src,用来放置工程源代码;
- 添加一个子目录doc,用来反之这个工程的文档hello.txt;
- 在工程目录添加文本文件COPYRIGHT,README;
- 在工程目录添加一个runhello.sh脚本,用来调用hello二进制;
- 将构建后的目标文件放入构建目录的bin子目录;
- 最终安装这些文件:将hello二进制与runhello.sh安装至/usr/bin,将doc目录的内容以及COPYRIGHT、README安装到/usr/share/doc/cmake/t2
1、准备工作
在/backup/cmake 目录下建立t2目录:
mkdir t2
mv t1/main.c t1/CMakeLists.txt t2/
touch COPYRIGHT
touch README
添加子目录src:
cd t2
mkdir src
mv main.c src
mkdir doc
vi doc/hello.txt # 随便写点东西进去并保存
进入子目录src,建立一个CMakeLists.txt,其内容如下:
ADD_EXECUTABLE(hello main.c)
# 换个地方保存目标二进制文件
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
t2工程的CMakeLists.txt修改为:
PROJECT(HELLO)
# 向当前工程添加源文件的子目录 src
# 并指定中间二进制文件和目标二进制文件存放的位置 编译目录下的bin目录 ( 可以不指定,则为编译目录下的src目录)
ADD_SUBDIRECTORY(src bin)
# 安装COPYRIGHT、README文件
INSTALL(FILES COPYRIGHT README DESTINATION share/doc/cmake/t2)
# 安装 runhello.sh
INSTALL(PROGRAMS runhello.sh DESTINATION bin)
# 安装doc目录中的内容,即hello.txt
INSTALL(DIRECTORY doc/ DESTINATION share/doc/cmake/t2) # 一定是doc/
# 安装可执行二进制、动态库、静态库
#INSTALL(TARGETS myrun mylib mystaticlib
RUNTIME DESTINATION bin
LIBRARY DESTINATION lib
ARCHIVE DESTINATION libstatic)
# 安装可执行二进制
INSTALL(TARGETS hello RUNTIME DESTINATION bin)
2、构建
在t2目录下新建build目录,进入build目录进行外部编译
此时-DCMAKE_INSTALL_PREFIX指定的目录就是上面INSTALL指令中的DESTINATION
cmake -DCMAKE_INSTALL_PREFIX=/tmp/t2/usr ..
make
sudo make install
安装结果:
如果你要直接安装到系统:
cmake -DCMAKE_INSTALL_PREFIX=/usr ..
问:如果没有定义CMAKE_INSTALL_PREFIX会安装到哪里?
CMAKE_INSTALL_PREFIX的默认定义是/usr/local哦。
问:你也许会疑惑,src目录下的CMakeLists.txt好像没有用到过?
在工程目录t2下的CMakeLists.txt中的一句ADD_SUBDIRECTORY(src bin),就会进入子目录src利用该目录下CMakeLlists.txt进行构建哦。