IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> CMakeLists.txt 详解 -> 正文阅读

[C++知识库]CMakeLists.txt 详解

目录

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 PROPERTIES
    VERSION ${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_HEADERS
    public/connector_type.h
    public/peer.h
    public/video_format.h
    public/sink.h
    public/wds_export.h
    public/audio_codec.h
    public/media_manager.h
    public/source.h
    public/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

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-07-03 10:32:27  更:2022-07-03 10:35:56 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/11 12:38:57-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码