• 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)

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

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

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

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

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

  • 相关阅读:
    java super()方法的作用
    算法分析与设计课后练习23
    软件设计模式系列之十五——职责链模式
    不做技术不会管理,测试人还有这个职位可以进阶
    JSON parse error Cannot deserialize value of type `java.util.Date` from String
    【OpenCV-Python】教程:3-11 图像变换(频域变换)
    跳出打工圈!程序员要如何走上创业逆袭路,获得财富自由
    ABTest如何计算最小样本量-工具篇
    数学问题求解能力提升:ChatGLM-Math模型的自我批评管道
    猴子也能学会的jQuery第十期——jQuery元素操作(下)
  • 原文地址:https://blog.csdn.net/u012915226/article/details/125222813