浅浅的 Cmake


参考资源:
https://zhuanlan.zhihu.com/p/119426899
https://blog.youkuaiyun.com/fengzhongluoleidehua/article/details/79809756
https://blog.youkuaiyun.com/dabenxiong666/article/details/53998998
添加头文件 https://blog.youkuaiyun.com/weixin_44100850/article/details/103697973
CMakeLists.txt写法

一、Cmake安装和基本使用

1、下载Cmake

环境Ubuntu18

sudo apt install cmake

查看版本号

sudo cmake --version

2、尝试第一次编译

建立一个文件夹,里面有:
测试源文件:main.cpp
Cmake文件:CMakeLists.txt
一个存放编译文件的空文件夹:bulid
main.cpp:

#include <stdio.h>
int main (int argc, char *argv[])
{
  printf("123\n");
  return 0;
}

CmakeLists.txt

3、替换成变量

https://www.cnblogs.com/narjaja/p/9533174.html

# VERSION需要和本机安装的Cmake对应
cmake_minimum_required(VERSION 3.16.3) 

# 设置工程名称,最后输出的可执行文件名称
project(App) 

# 添加可执行文件添加需要编译的文件 
add_executable(App main.cpp) 

进入到bulid目录下,开始编译

Cmake ..
make

最终得到可执行文件App。

使用变量替换生存的执行文件:

# VERSION需要和本机安装的Cmake对应
cmake_minimum_required(VERSION 3.16.3) 

#通过PROJECT指令定义的项目名称 :https://www.cnblogs.com/narjaja/p/9533174.html
set (PROJECT_NAME tianxiaohua)

# 设置工程名称,最后输出的可执行文件名称
project(${PROJECT_NAME}) 

# 添加可执行文件添加需要编译的文件 
add_executable(${PROJECT_NAME} main.cpp) 

二、Cmake头文件

https://www.cnblogs.com/binbinjx/p/5626916.html

1、在原来的项目路径基础上可以增加main.h头文件

// the configured options and settings for Tutorial
#define Tutorial_VERSION_MAJOR 0
#define Tutorial_VERSION_MINOR 0

修改原来的源文件:

// A simple program that computes the square root of a number
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "main.h"
 
int main (int argc, char *argv[])
{
  if (argc < 2)
    {
    fprintf(stdout,"%s Version %d.%d\n",argv[0],Tutorial_VERSION_MAJOR,Tutorial_VERSION_MINOR);
    fprintf(stdout,"Usage: %s number\n",argv[0]);
    return 1;
    }
  double inputValue = atof(argv[1]);
  double outputValue = sqrt(inputValue);
  fprintf(stdout,"The square root of %g is %g\n",
          inputValue, outputValue);
  return 0;
}

2、增加头文件

修改Cmake:

include_directories([AFTER|BEFORE] [SYSTEM] dir1 [dir2 …])
它相当于g++选项中的-I参数的作用,也相当于环境变量中增加路径到CPLUS_INCLUDE_PATH变量的作用。

CmakeLists.txt

# VERSION需要和本机安装的Cmake对应
cmake_minimum_required(VERSION 3.16.3) 

#通过PROJECT指令定义的项目名称 
set (PROJECT_NAME tianxiaohua)

# 设置工程名称,最后输出的可执行文件名称
project (${PROJECT_NAME})

# 添加编译选项
add_compile_options(-std=c++11)

# 添加头文件的路径
include_directories(/)
 
# 添加可执行文件添加需要编译的文件 
add_executable(${PROJECT_NAME}  main.cpp)

重新进入bulid文件内,编译执行。

三、添加多个源文件和多组源文件

cmake自动添加所有源文件和头文件 https://blog.youkuaiyun.com/sep4075/article/details/120001415

1、新建多个源文件和头文件

在这里插入图片描述
2、新的cmake源码
参考:https://www.cnblogs.com/dilex/p/11102152.html

# VERSION需要和本机安装的Cmake对应
cmake_minimum_required(VERSION 3.16.3) 

#通过PROJECT指令定义的项目名称 
set (PROJECT_NAME tianxiaohua)

# 设置工程名称,最后输出的可执行文件名称
project (${PROJECT_NAME})

# 添加编译选项
add_compile_options(-std=c++11)

# 添加头文件的路径
include_directories(Include)

# 查找source目录下的所有*.cpp,*.c源文件,并将文件列表保存到 DIR_LIB_SRCS 变量,遍历获取source/路径下所有的*.cpp和*.c文件列表
file(GLOB_RECURSE SRC_DIR_LIST "Source/*.cpp" "Source/*.c")

# 添加可执行文件添加需要编译的文件 
add_executable(${PROJECT_NAME} ${SRC_DIR_LIST})

另外的方法:

# CMake 最低版本号要求
cmake_minimum_required(VERSION 3.0)

# 项目名称
project(CMakeFile)

# 设置md5代码文件的路径
set(MD5_FILE "./common/md5/md5.cpp" "./common/md5/md5.h")

# 查找指定目录下的所有.cpp与.h文件 并存放到指定变量名SC_FILES中
FILE(GLOB SC_FILES "*.cpp" "*.h")

# 对md5的源码分组到md5组里
source_group(md5 FILES ${MD5_FILE})

# 指定生成目标
add_executable(${PROJECT_NAME} ${SC_FILES} ${MD5_FILE})

四、包含其他库文件

 add_executable(。。。)
 target_link_libraries(。。。)

五、生成库文件

1、新的Cmake文件

# VERSION需要和本机安装的Cmake对应
cmake_minimum_required(VERSION 3.16.3) 

#通过PROJECT指令定义的项目名称 
set (PROJECT_NAME tianxiaohua)

# 设置工程名称,最后输出的可执行文件名称
project (${PROJECT_NAME})

# 添加编译选项
add_compile_options(-std=c++11)

# 添加头文件的路径
include_directories(Include)

# 查找source目录下的所有*.cpp,*.c源文件,并将文件列表保存到 DIR_LIB_SRCS 变量,遍历获取source/路径下所有的*.cpp和*.c文件列表
file(GLOB_RECURSE SRC_DIR_LIST "Source/*.cpp" "Source/*.c")

# 将DIR_LIB_SRCS中文件列表以静态库的方式加入工程//将DIR_LIB_SRCS中文件列表以静态库的方式加入工程
add_library(
    ${PROJECT_NAME} # 生成的输出个输出工程文件名称
    STATIC          # STATIC生成静态库文件.a  SHARED生成动态库文件.so
    ${SRC_DIR_LIST} # 所有源文件的集合
) 

# 打印SRC_DIR_LIST中列表信息
message(STATUS "SRC_DIR_LIST = ${SRC_DIR_LIST}")			


# 添加可执行文件添加需要编译的文件 
#add_executable(${PROJECT_NAME}  main.cpp)

七、

CMake常用变量

变量名 变量说明
PROJECT_NAME 返回通过PROJECT指令定义的项目名称
PROJECT_SOURCE_DIR CMake源码地址,即cmake命令后指定的地址
PROJECT_BINARY_DIR 运行cmake命令的目录,通常是PROJECT_SOURCE_DIR下的build目录
CMAKE_MODULE_PATH 定义自己的cmake模块所在的路径
CMAKE_CURRENT_SOURCE_DIR 当前处理的CMakeLists.txt所在的路径
CMAKE_CURRENT_LIST_DIR 当前文件夹路径
CMAKE_CURRENT_LIST_FILE 输出调用这个变量的CMakeLists.txt的完整路径
CMAKE_CURRENT_LIST_LINE 输出这个变量所在的行
CMAKE_RUNTIME_OUTPUT_DIRECTORY 生成可执行文件路径
CMAKE_LIBRARY_OUTPUT_DIRECTORY 生成库的文件夹路径
CMAKE_BUILD_TYPE 指定基于make的产生器的构建类型(Release,Debug)
CMAKE_C_FLAGS *.C文件编译选项,如 -std=c99 -O3 -march=native
CMAKE_CXX_FLAGS *.CPP文件编译选项,如 -std=c++11 -O3 -march=native
CMAKE_CURRENT_BINARY_DIR target编译目录
CMAKE_INCLUDE_PATH 环境变量,非cmake变量
CMAKE_LIBRARY_PATH 环境变量
CMAKE_STATIC_LIBRARY_PREFIX 静态库前缀, Linux下默认为lib
CMAKE_STATIC_LIBRARY_SUFFIX 静态库后缀,Linux下默认为.a
CMAKE_SHARED_LIBRARY_PREFIX 动态库前缀,Linux下默认为lib
CMAKE_SHARED_LIBRARY_SUFFIX 动态库后缀,Linux下默认为.so
BUILD_SHARED_LIBS 如果为ON,则add_library默认创建共享库
CMAKE_INSTALL_PREFIX 配置安装路径,默认为/usr/local
CMAKE_ABSOLUTE_DESTINATION_FILES 安装文件列表时使用ABSOLUTE DESTINATION 路径
CMAKE_AUTOMOC_RELAXED_MODE 在严格和宽松的automoc模式间切换
CMAKE_BACKWARDS_COMPATIBILITY 构建工程所需要的CMake版本
CMAKE_COLOR_MAKEFILE 开启时,使用Makefile产生器会产生彩色输出
CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS 用来控制IF ELSE语句的书写方式

使用CMake交叉编译Arm Linux程序

https://blog.youkuaiyun.com/whahu1989/article/details/104114515

cmake / CMAKE_INSTALL_PREFIX
https://blog.youkuaiyun.com/itworld123/article/details/127087610
通过设置make install 路径直接把生成文件输出到指定的位置

如果找不到合适的库路径可以使用如下的方式直接设置库路径

set(LIBEVENT_LIBRARIES "/home/tianhao/rtsp/test1/smolrtsp/libevent/lib/libevent.a")  # 替换为实际的库文件名
set(LIBEVENT_INCLUDE_DIR "/home/tianhao/rtsp/test1/smolrtsp/libevent/include")  # 替换为实际的库文件名

target_link_libraries(server smolrtsp smolrtsp-libevent ${LIBEVENT_LIBRARIES})
target_include_directories(server PRIVATE ${LIBEVENT_INCLUDE_DIR})
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值