CMake 学习笔记2

发布于:2024-04-11 ⋅ 阅读:(155) ⋅ 点赞:(0)

其他很好的总结

CMake教程系列-01-最小配置示例 - 知乎

1、基本关键字

MESSAGE关键字

向终端输出用户自定义的信息

主要包含三种信息

  • SEND_ERROR,产生错误,生成过程被跳过
  • STATUS,输出前缀--的信息,MESSAGE(STATUS "this is binary dir")
  • FATAL_ERROR,立即终止cmake过程

ADD_EXECUTABLE关键字

生成可执行文件ADD_EXECUTABLE(hello main.cpp)

注意:工程名HELLO和生成的可执行文件hello是没有关系的

cmake 语法基本原则

变量使用${}方式取值,但是在IF控制语句中是直接使用变量名

指令(参数1 参数2 ...)参数使用括弧扩起,参数之间使用空格或分号分开

指令是大小写无关的,参数和变量是大小写相关的,但推荐指令全部大写

语法注意:

set(SRC_LIST main.cpp)可以加双引号 set(SRC_LIST "mian.cpp"),如果名字中有空格则建议加引号

ADD_EXECUTABLE(hello main)后缀可以不写,他会自动取找.c和.cpp但是最好写后缀防止有main这样的可执行文件等文件。

2、内部构建和外部构建

内部构建产生的文件特别多,不方便清理

外部构建会把产生的临时文件放在build下,不会对源文件有任何影响,推荐使用外部构建方式

mkdir build

cd build

cmake ..

make

3、工程配置 make install

可以用src文件夹放源码,可以在工程中添加脚本runhello.sh来调用hello二进制。将构建后的文件放到bin子目录

3.1 将生成文件放到bin

mkdir src

mv main.cpp src/

cd src

touch CMakeList.txt(src 下)

cd ..

touch CMakeList.txt(工程下)

==========================

CMakeList.txt(工程下)

PROJECT(HELLO)

ADD_SUBDIRECTORY(src bin)  #关联src

INSTALL(FILES COPYRIGHT README DESTINATION share/doc/cmake)#安装文件

INSTALL(PROGRAMS runhello.sh DESTINATION bin)#安装脚本

INSTALL(DIRECTORY doc/ DESTINATION share/doc/cmake)#安装doc下的hello.txt

CMakeList.txt(src下)

ADD_EXECUTABLE( hello main.cpp)

==================

ADD_SUBDIRECTORY指令

ADD_SUBDIRECTORY(source_dir [binary_dir] [EXCLUDE_FROM_ALL])

这个指令用于当前工程添加存放源文件的子目录,并且可以指定中间二进制和目标二进制的存放位置

EXCLUDE_FROM_ALL函数是将写的目录从编译中排除,如程序中的example

ADD_SUBDIRECTORY(src bin)将src子目录加入工程并指定编译输出(包含编译中间结果)路径为bin目录。如果不进行bin目录指定,那么编译结果在build/src目录下

3.2安装COPYRIGHT和README

INSTALL(FILES COPYRIGHT README DESTINATION share/doc/cmake)

FILES文件

DESTINATION:写绝对路径,可以写相对路径,相对路径实际路径是

${CMAKE_INSTALL_PREFIX}/<DESTINATION定义的路径>

CMAKE_INSTALL_PREFIX 默认在、usr/local/

cmake -DCMAKE_INSTALL_PREFIX=/usr 在cmake时候指定CMAKE_INSTALL_PREFIX变量的路径

3.3安装脚本runhello.sh

PROGRAMS:非目标文件的可执行程序安装(比如脚本之类)

INSTALL(PROGRAMS runhello.sh DESTINATION bin)

说明:实际安装到的是/usr/local/bin

3.4安装doc中的hello.txt

一是通过在doc目录建立CMakeList.txt,通过install下的file

二是直接在工程目录通过

INSTALL(DIRECTORY doc/ DESTINATION share/doc/cmake)

DIRECTORY后面连接的是所在source目录的相对路径

注意:abc/和abc有很大区别。不以/结尾,这个目录将被安装位目标路径下。以/结尾,这个目录中的内容将安装到目标路径

4、静态库和动态库构建

4.1

tree:

├── build
├── CMakeLists.txt
└── lib
    ├── CMakeLists.txt
    ├── hello.cpp
    └── hello.h

hello.h:

#ifndef HELLO_H
#define HELLO_H

void HelloFunc();

#endif

hello.cpp

#include "hello.h"
#include <iostream>
void HelloFunc(){
    std::cout<<"hello world"<<std::endl;
}

CMakeLists.txt外层

PROJECT(HELLO)

ADD_SUBDIRECTORY(lib bin)

CMakeLists.txt

SET(LIBHELLO_SRC hello.cpp)
ADD_LIBRARY(hello SHARE ${LIBHELLO_SRC})#生成共享库

ADD_LIBRARY

ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})

hello:就是正常的库名,生成的名字会加上lib,最终文件是libhello.lib

SHARED,动态库,STATIC,静态库

${LIBHELLO_SRC}:源文件

4.2同时构建静态库和动态库

SET_TARGET_PROPERTIES

这条指令可以用来设置输出的名称,对于动态库,还可以用来指定动态库版本和API版本


网站公告

今日签到

点亮在社区的每一天
去签到