开发一个项目,最终总要输出一个可执行文件或者共享库,这时通过编译CMakeLists.txt来完成。
CMake就做了这件事。
本文以hello为例从构建工程,到安装helloWord为止。
1.构建文件目录的tree
2.文件编写
2.1.cpp文件
2.2.CMakeLists.txt -> cmake .(Makefile) ->make(hello)
3.安装
4.CMAKE语法
1.构建文件目录的tree
1.1工程目录
1.1.1根目录:
CMakeLists.txt
安装文件:相对路径,前面会调用:CMAKE_INSTALL_PREFIX(默认/usr/local)
安装脚本:runhello.sh 在根目录下;bin:/usr/local/bin
安装目录:要加/
PROJECT(HELLO)
ADD_SUBDIRECTORY(src bin)
INSTALL(FILES COPYRIGHT README DESTINATION share/doc/cmake/)
INSTALL(PROGRAMS runhello.sh DESTINATION bin)
INSTALL(DIRECTORY doc/ DESTINATION share/doc/cmake)
1.1.2 子目录src: 工程源码,各种cpp + CMakeLists.txt
CMakeLists.txt
ADD_EXECUTABLE(hello main.cpp)
1.1.3. 子目录build: 过程文件
创建文件夹并在此文件夹下运行cmake make 后自动创建bin目录生成二进制的hello文件。
mkdir build
cd build #到build下编译
cmake .. #把编译的文件放在 BINARY 路径: /build 生成Makefile
#SOURCE 路径:原路径
make #此时都是在build目录下
cd bin
./hello
添加 目录 输出
ADD_SUBDIRECTORY(src bin)
ADD_SUBDIRECTORY(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
更改
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
2.文件编写
2.1.cpp文件
#main.cpp
#include <iostream>
int main(){
std::cout << "hello word" << std::endl;
}
2.2.CMakeList.txt 得到makefile
语法:
1.工程文件名(HELLO)和输出文件名(hello)无关。
2.参数用“空格”或者“;”分割 .cpp
3.读变量&()
4.指令全大写
5.文件要加后缀
#CMakeLists.txt
PROJECT (HELLO) #指令全大写
SET(SRC_LIST main.cpp) #文件加后缀
#SET(SRC_LIST main.cpp t1.cpp;t2.cpp) #空格或者;隔开
MESSAGE(STATUS "This is BINARY dir " ${HELLO_BINARY_DIR}) #变量读取$()
MESSAGE(STATUS "This is SOURCE dir "${HELLO_SOURCE_DIR})
#
ADD_EXECUTABLE(hello ${SRC_LIST})
2.3COPYRIGHT
2.4 README
2.5 runhello.sh
2.6 doc/hello.txt
3.安装
INSTALL的安装可以包括:二进制、动态库、静态库以及文件、目录、脚本等。
1.修改工程文件的CMakeLists.txt
2.bash命令
INSTALL(FILES COPYRIGHT README DESTINATION share/doc/cmake/)
INSTALL(PROGRAMS runhello.sh DESTINATION bin)
INSTALL(DIRECTORY doc/ DESTINATION share/doc/cmake)
# 此时build下没有文件 到build文件夹下 cmake make make install
cd build
cmake .. #生成 Makefile
make #生成 bin/hello
make install #默认安装到 /usr/local/
4.CMAKE语法
4.1PROJECT
用来指定工程的名字和支持的语言
PROJECT (HELLO) 指定了工程的名字,并且支持所有语言—建议
PROJECT (HELLO CXX) 指定了工程的名字,并且支持语言是C++
PROJECT (HELLO C CXX) 指定了工程的名字,并且支持语言是C和C++
4.2 MESSAGE
向终端输出用户自定义信息
- SEND_ERROR,产生错误,生成过程被跳过。
- SATUS,输出前缀为—的信息。
- FATAL_ERROR,立即终止所有 cmake 过程.
4.3SET
用来显示的指定变量的
SET(SRC_LIST main.cpp) SRC_LIST变量就包含了main.cpp
也可以 SET(SRC_LIST main.cpp t1.cpp t2.cpp)
4.4 ADD_EXECUTABLE
生成可执行文件,以下3种写法都可以
ADD_EXECUTABLE(hello ${SRC_LIST})
ADD_EXECUTABLE(hello main.cpp)
PROJECT(HELLO)
ADD_EXECUTABLE(hello main.cpp)