CMake学习笔记(2)——建立一个标准的工程和安装程序
2016-06-26 17:24
656 查看
接下来让建立一个更加标准的工程t2。
这个工程的目录结构如下:
build:是编译生成的文件的目录;
doc:是工程文本文件;
COPYRIGHT:版权说明;
README:工程说明;
runhello.sh:是程序执行文件,内容为执行文件的名称hello。
这里有两个CMakeLists.txt,一个在工程目录下,一个在src目录下,如果工程存在多个目录,需要确保每个目录都有一个CMakeLists.txt文件。
这两个存在一种包含关系内容分别为:
工程目录下的CMakeLists.txt:
src下的CMakeLists.txt:
ADD_SUBDIRECTORY可以添加子目录,这里添加了src目录,还可以指定编译后的二进制文件输出目标,这里是bin文件;
EXECUTALBE_OUTPUT_PATH:编译输出目录,这里通过SET重新定义变量EXECUTALBE_OUTPUT_PATH来将指定最终的二进制文件输出目录。
main.c文件的内容:
然后进入build目录构建:
以下是编译后的t2工程目录结构:
可以看到在t2/build/bin目录下有一个名为hello的可执行文件。
接下来我们可以安装这个可执行文件到指定的目录:
INSTALL指令,可以安装指定的文件到指定的目录下面。
第一个参数指定要安装的文件的类型,第二个参数DESTINATION指定安装的具体目录。
重新构建工程:
执行make install的时候输出:
最后的安装结果是:
这个工程的目录结构如下:
t2 ├── build ├── CMakeLists.txt ├── COPYRIGHT ├── doc │ └── hello.txt ├── README ├── runhello.sh └── src ├── CMakeLists.txt └── main.c
build:是编译生成的文件的目录;
doc:是工程文本文件;
COPYRIGHT:版权说明;
README:工程说明;
runhello.sh:是程序执行文件,内容为执行文件的名称hello。
这里有两个CMakeLists.txt,一个在工程目录下,一个在src目录下,如果工程存在多个目录,需要确保每个目录都有一个CMakeLists.txt文件。
这两个存在一种包含关系内容分别为:
工程目录下的CMakeLists.txt:
PROJECT(HELLO) ADD_SUBDIRECTORY(src bin)
src下的CMakeLists.txt:
ADD_EXECUTABLE(hello main.c) SET(EXECUTALBE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
ADD_SUBDIRECTORY可以添加子目录,这里添加了src目录,还可以指定编译后的二进制文件输出目标,这里是bin文件;
EXECUTALBE_OUTPUT_PATH:编译输出目录,这里通过SET重新定义变量EXECUTALBE_OUTPUT_PATH来将指定最终的二进制文件输出目录。
main.c文件的内容:
//main.c
#include <stdio.h> int main() { printf("hello world\n"); return 0; }
然后进入build目录构建:
cmake .. make
以下是编译后的t2工程目录结构:
t2 ├── build │ ├── bin │ │ ├── CMakeFiles │ │ │ ├── CMakeDirectoryInformation.cmake │ │ │ ├── hello.dir │ │ │ │ ├── build.make │ │ │ │ ├── C.includecache │ │ │ │ ├── cmake_clean.cmake │ │ │ │ ├── DependInfo.cmake │ │ │ │ ├── depend.internal │ │ │ │ ├── depend.make │ │ │ │ ├── flags.make │ │ │ │ ├── link.txt │ │ │ │ ├── main.o │ │ │ │ └── progress.make │ │ │ └── progress.marks │ │ ├── cmake_install.cmake │ │ ├── <span style="color:#ff0000;">hello</span> │ │ └── Makefile │ ├── CMakeCache.txt │ ├── CMakeFiles │ │ ├── CMakeCCompiler.cmake │ │ ├── cmake.check_cache │ │ ├── CMakeCXXCompiler.cmake │ │ ├── CMakeDetermineCompilerABI_C.bin │ │ ├── CMakeDetermineCompilerABI_CXX.bin │ │ ├── CMakeDirectoryInformation.cmake │ │ ├── CMakeOutput.log │ │ ├── CMakeSystem.cmake │ │ ├── CMakeTmp │ │ │ └── CMakeFiles │ │ │ └── cmTryCompileExec.dir │ │ ├── CompilerIdC │ │ │ ├── a.out │ │ │ └── CMakeCCompilerId.c │ │ ├── CompilerIdCXX │ │ │ ├── a.out │ │ │ └── CMakeCXXCompilerId.cpp │ │ ├── Makefile2 │ │ ├── Makefile.cmake │ │ ├── progress.marks │ │ └── TargetDirectories.txt │ ├── cmake_install.cmake │ └── Makefile ├── CMakeLists.txt ├── CMakeLists.txt~ ├── COPYRIGHT ├── doc │ └── hello.txt ├── README ├── runhello.sh └── src ├── CMakeLists.txt └── main.c
可以看到在t2/build/bin目录下有一个名为hello的可执行文件。
接下来我们可以安装这个可执行文件到指定的目录:
INSTALL(FILES COPYRIGHT README DESTINATION share/doc/cmake/t2) INSTALL(PROGRAMS build/bin/hello runhello.sh DESTINATION bin) INSTALL(DIRECTORY doc/ DESTINATION share/doc/cmake/t2)
INSTALL指令,可以安装指定的文件到指定的目录下面。
第一个参数指定要安装的文件的类型,第二个参数DESTINATION指定安装的具体目录。
重新构建工程:
cmake -DCMAKE_INSTALL_PREFIX=/tmp/t2/usr .. make make install这里CMAKE_INSTALL_PREFIX指定安装目录。
执行make install的时候输出:
[100%] Built target hello Install the project... -- Install configuration: "" -- Installing: /tmp/t2/usr/share/doc/cmake/t2/COPYRIGHT -- Installing: /tmp/t2/usr/share/doc/cmake/t2/README -- Installing: /tmp/t2/usr/bin/hello -- Installing: /tmp/t2/usr/bin/runhello.sh -- Installing: /tmp/t2/usr/share/doc/cmake/t2 -- Installing: /tmp/t2/usr/share/doc/cmake/t2/hello.txt
最后的安装结果是:
t2/ └── usr ├── bin │ ├── hello │ └── runhello.sh └── share └── doc └── cmake └── t2 ├── COPYRIGHT ├── hello.txt └── README
相关文章推荐
- c关键字
- javascript ajax和jquery ajax
- 常见dos命令总结
- Select模型及tcp select模型
- 把图标做成字体
- loongson 2f 和u-boot中的cache命令对照
- js基础学习之-js全局对象
- lfpt_使用
- [疯狂Java]面向对象:不可变类
- PostgreSQL问题解决--连接失败
- 京东要如何解决1号店人员问题?网易考拉:我来帮你
- 【干货2】安全技术资源大整合
- Dubbo入门案例
- 【DAY3】shell编程以及linux的其他设置学习笔记
- 双击bat用CMD窗口打开jar,让cmd停留(专为没有界面的java程序设计的)
- rsync+inotify 远程备份 同步 centos
- JavaScript学习【持续更新】
- Java NIO系列教程(三) Buffer
- web前端面试题及答案汇总
- UVa232 Crossword Answers