目录

CMakeLists.txt用例详解(WDS中的用例)

CMakeLists.txt作用

生成对象库OBJECT实例(wds/libwds/common/CMakeLists.txt)

生成库so(wds/libwds/CMakeLists.txt)

生成二进制可执行程序(wds/desktop_source/CMakeLists.txt)

CMake相关参考


CMakeLists.txt用例详解(WDS中的用例)

CMakeLists.txt作用

cmake的所有语句都写在一个CMakeLists.txt的文件中,CMakeLists.txt文件确定后,直接使用cmake命令进行运行,但是这个命令要指向CMakeLists.txt所在的目录,cmake之后就会产生我们想要的makefile文件,然后再直接make就可以编译出我们需要的结果了。

更简单的解释就是cmake是为了生成makefile而存在,这样我们就不需要再去写makefile了,只需要写简单的CMakeLists.txt即可

生成对象库OBJECT实例(wds/libwds/common/CMakeLists.txt)

# c++编译器设置编译选项,例如-std=c++11选项,在编译c++代码时加上c++11支持选项
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall -fvisibility=hidden -fPIC")
# c编译器设置编译选项
set(CMAKE_C_FLAGS "${CMAKE_CXX_FLAGS} -std=c99 -Wall")# 将指定目录添加到编译器的头文件搜索路径之下,指定的目录被解释成当前源码路径的相对路径
# PROJECT_SOURCE_DIR为包含PROJECT()的最近一个CMakeLists.txt文件所在的文件夹
include_directories ("${PROJECT_SOURCE_DIR}" "${PROJECT_SOURCE_DIR}/libwds/rtsp/gen")# add_library(<name> OBJECT [<source>...])
# 这种形式类型固定为OBJECT,以这种方式,只编译source列表的文件,但不将生成的目标文件打包或者链接为
# 库,而是在其他add_library()或者add_executable()生成目标的时候,可以使用形如
# $<TARGET_OBJECTS:name>的表达式将对象库作为源引入
# 见实例2引用
add_library(wdscommon OBJECT logging.cpp message_handler.cpp rtsp_input_handler.cpp video_format.cpp)# 添加这条语句就是提醒编译器需要先生成wdscommon的依赖wdsrtsp,然后再去生成wdscommon
add_dependencies(wdscommon wdsrtsp)

生成库so(wds/libwds/CMakeLists.txt)

# c++编译器设置编译选项,例如-std=c++11选项,在编译c++代码时加上c++11支持选项
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall -fvisibility=hidden")
# c编译器设置编译选项
set(CMAKE_C_FLAGS "${CMAKE_CXX_FLAGS} -std=c99 -Wall")# 用来使用指定的源文件向工程中添加一个目标库(即生成库文件)
# STATIC为静态库.a, SHARED为动态库.so
# $<TARGET_OBJECTS:wdsrtsp>见实例1中add_library(<name> OBJECT [<source>...])用法
add_library(wds SHARED $<TARGET_OBJECTS:wdsrtsp>$<TARGET_OBJECTS:wdscommon>$<TARGET_OBJECTS:wdssink>$<TARGET_OBJECTS:wdssource>)# 按照规则,动态库是应该包含一个版本号的,
# VERSION指代动态库版本,SOVERSION指代API版本。
set_target_properties(wds PROPERTIESVERSION ${WDS_VERSION_MAJOR}.${WDS_VERSION_MINOR}.${WDS_VERSION_PATCH}SOVERSION ${WDS_VERSION_MAJOR})# 参数中的TARGETS后面跟的就是我们通过ADD_EXECUTABLE 或者 ADD_LIBRARY 定义的目标文件,
# 可能是可执行二进制、动态库、静态库
# LIBRARY(动态库类型)为目标类型,ARCHIVE(静态库类型),RUNTIME(可执行二进制类型)
# DESTINATION 定义了安装的路径,后边一般跟着安装路径,绝对路径要以/开头,否则为相对路径
install(TARGETS wds LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})set(PUBLIC_HEADERSpublic/connector_type.hpublic/peer.hpublic/video_format.hpublic/sink.hpublic/wds_export.hpublic/audio_codec.hpublic/media_manager.hpublic/source.hpublic/logging.h)# 安装set指定PUBLIC_HEADERS文件到${CMAKE_INSTALL_FULL_INCLUDEDIR}/wds目录下
# CMAKE_INSTALL_FULL_INCLUDEDIR为编译输出include目录的绝对路径
install(FILES ${PUBLIC_HEADERS} DESTINATION ${CMAKE_INSTALL_FULL_INCLUDEDIR}/wds)

生成二进制可执行程序(wds/desktop_source/CMakeLists.txt)

# c++编译器设置编译选项,例如-std=c++11选项,在编译c++代码时加上c++11支持选项
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -pthread -std=c++11")# 将指定目录添加到编译器的头文件搜索路径之下,指定的目录被解释成当前源码路径的相对路径
# PROJECT_SOURCE_DIR为包含PROJECT()的最近一个CMakeLists.txt文件所在的文件夹
include_directories ("${PROJECT_SOURCE_DIR}")
include_directories ("${PROJECT_SOURCE_DIR}/libwds/public")
include_directories ("${PROJECT_SOURCE_DIR}/libwds/parser")
include_directories ("${PROJECT_SOURCE_DIR}/p2p")
include_directories ("${PROJECT_SOURCE_DIR}/mirac_network")# find_package用于查找包(通常是使用三方库),
# 并返回关于包的细节(使用包所依赖的头文件、库文件、编译选项、链接选项等).
# 如果某个依赖项既不提供查找模块,也不提供供应商打包的CMake文件,
# 依赖 pkg-config 程序,来找到系统上的包
find_package(PkgConfig REQUIRED)# 当找到 pkg-config 时, CMake需要提供两个函数,来封装这个程序提供的功能
# pkg_check_modules,查找传递列表中的所有模块(库和/或程序)
# pkg_search_module 要在传递的列表中找到第一个工作模块 与 find_package 一样,这些函数接受
# REQUIRED 和 QUIET 参数
pkg_check_modules (GLIB2 REQUIRED glib-2.0)
include_directories(${GLIB2_INCLUDE_DIRS})pkg_check_modules (GIO REQUIRED gio-2.0)
include_directories(${GIO_INCLUDE_DIRS})pkg_check_modules (GST REQUIRED gstreamer-1.0)
include_directories(${GST_INCLUDE_DIRS})# 使用指定的源文件来生成目标可执行文件
add_executable(desktop-source-test main.cpp source-app.cpp mirac_broker_source.cpp desktop_media_manager.cpp)# 为desktop-source-test连接 库的头文件路径(被link库生成CMakeLists.txt中定义的头文件路径)
# 和对应定义的函数库路径
target_link_libraries (desktop-source-test  mirac wds p2p ${GIO_LIBRARIES} ${GST_LIBRARIES})# 安装可执行文件到指定生成目录
if (WDS_INSTALL_TESTS)install(PROGRAMS desktop-source-test DESTINATION ${CMAKE_INSTALL_FULL_BINDIR})
endif()

CMake相关参考

Cmake 常用变量和常用环境变量

Cmake命令之cmake_minimum_required介绍

Cmake命令之set

Cmake命令之find_library

Cmake命令之find_package

Cmake命令之include_directories

Cmake命令之pkg_check_modules

Cmake命令之add_executable

Cmake命令之target_link_libraries

Cmake命令之add_subdirectory

Cmake命令之list

Cmake命令之project

Cmake命令之configure_file

Cmake命令之set_target_properties

Cmake命令之install

CMakeLists.txt 详解相关推荐

  1. CMakeLists.txt详解

    一:CMakeLists.txt文件是cmake用来生成Makefile文件需要的一个描述编译链接的规则文件 学习cmake需要提前了解gcc等编译命令,先来解释一条最简单的命令 gcc ./sour ...

  2. 【每天学习一点新知识】robots.txt详解

    目录 什么是robots.txt? 如何查看robots.txt? robots.txt的内容 常见的搜索引擎的蜘蛛名称 如果创建并上传robots.txt文件? 如果网站信息都需要被抓取,是不是可以 ...

  3. python 多数据输出到txt_详解python读取和输出到txt

    读取txt的数据和把数据保存到txt中是经常要用到的,下面我就总结一下. 读txt文件 python常用的读取文件函数有三种read().readline().readlines() 以读取上述txt ...

  4. 【转载】CMake 语法 - 详解 CMakeLists.txt

    作者:红橙Darren 链接:https://www.jianshu.com/p/528eeb266f83 来源:简书 目录 1. 初试 cmake 的 helloworld 2. 构建生成 .so ...

  5. adb logcat 保存_adb命令——日志命令详解——全部输出到桌面: adb logcat c:\users\del\desktop\log.txt...

    adb logcat 一.在cmd窗口查看手机的Log日志 有时候我们在手机程序上的日志要在其他地方调试,然后要看里面的Log日志.在cmd窗口中输入如下命令: //格式1:打印默认日志数据 adb ...

  6. Robots.txt 协议详解及使用说明

    一.Robots.txt协议 Robots协议,也称为爬虫协议.机器人协议等,其全称为"网络爬虫排除标准(Robots Exclusion Protocol)".网站通过Robot ...

  7. python数据挖掘笔记】二十.KNN最近邻分类算法分析详解及平衡秤TXT数据集读取

    #2018-04-06 07:57:00 April Friday the 14 week, the 096 day SZ SSMR python数据挖掘笔记]二十.KNN最近邻分类算法分析详解及平衡 ...

  8. caffe学习之——CMakeList.txt内容详解

    在对Caffe使用cmake方式编译安装时产生了对这个文件的好奇,打算做个注释理解, 参考:https://blog.csdn.net/fuzi2012/article/details/7245453 ...

  9. java读写json格式的文件方法详解.txt,并批量存储进redis

    捐躯赴国难,视死忽如归.恸哭六军俱缟素,冲冠一怒为红颜.君子坦荡荡,小人长戚戚.风日晴和人意好,夕阳箫鼓几船归.民为贵,社稷次之,君为轻.Java 读写json格式的文件方法详解 文章录入:7747. ...

最新文章

  1. 值类型和引用类型在栈和堆中的分配
  2. Scrapy爬取妹子图保存到不同目录下
  3. 《Python编程快速上手——让繁琐工作自动化》——第一部分 Python编程基础 第1章 Python基础 1.1 在交互式环境中输入表达式...
  4. vilatile 深入理解java虚拟机_《深入理解Java虚拟机》笔记 第十二章 volatile变量
  5. iphone电池怎么保养_蓄电池在ups系统中应该怎么维护保养?
  6. (1)变量、常量、程序交互、数据类型、bool、基本运算符
  7. Rushcrm:CRM系统中的进销存管理
  8. spring-boot-route(十九)spring-boot-admin监控服务
  9. 360CERT网络安全11月月报 | 新增四大双重勒索病毒家族
  10. Android实现可编辑下拉菜单
  11. Autolayout - NSLayoutAnchor
  12. Fabric链码实战(二)公民身份信息
  13. Maple、MATLAB、MathCAD和Mathematica
  14. 万字详述 Flink SQL 4 种时间窗口语义!(收藏)
  15. HTML中z index属性是用来,css中z-index 属性与用法详解
  16. 从育碧、工业光魔归来,做原创国漫!20年动画人徐健的CG路
  17. [DP46题] HDU 1864 最大报销额
  18. Mac出现问题的5个警告信号与处理方法
  19. 量化交易 米筐 多因子策略总结
  20. 【音频分离】python包安装方法以及音频分离

热门文章

  1. java虚拟机的内存管理
  2. # Itext Pdf 生成、相关API
  3. linux代码行数统计工具,统计代码行数工具 用golang实现
  4. 如何将STEP7的块导出及后续
  5. C语言常用词汇积累及其翻译,c语言重要专业词汇带翻译
  6. ENVI app store报错:打不开和显示无法联网
  7. Ubuntu安装使用SVN
  8. 【Mysql学习之旅-2】经典sql面试题及答案分析
  9. mysql的默认端口_MYSQL默认使用的端口是( )
  10. XXL-JOB - 调度中心和执行器的简单使用