cmake开发实战教程
前言
开发中经常会使用到Qt,VS,有时候,还会遇到跨平台的开发,虽然qmake也能满足跨平台。但是使用cmake
配置起来更简单,下面分别将各个cmake中的用法。当然,这篇博客的目的是能够直接通过cmake模板来开发项目,
修改项目。
一、cmake中函数
CMAKE_MINIMUM_REQUIRED
cmake版本的最小要求
CMAKE_MINIMUM_REQUIRED(VERSION 3.10.0)
cmake最小版本3.10.0,cmake不能低于VERSION 定义的版本(本初是3.10.0)
SET
SET 用变量代替值
例如 SET(PRJ_NAME hello)
设置PRJ_NAME为hello
PROJECT
PROJECT(${PRJ_NAME})
通过上面的SET PRJ_NAME,后面只要将SET(PRJ_NAME hello)中的hello替换,不影响整个工程,后面
需要用到PRJ_NAME时,只要修改SET(PRJ_NAME hello)这一句就可以了。
IF/ELSE/ENDIF
IF(WIN32)
SET(CMAKE_DEBUG_POSTFIX "_d")
ENDIF(WIN32)
这一句是如果windows下,CMAKE_DEBUG_POSTFIX 设置生成debug后缀
IF(WIN32)
# 如果是windows
ELSE(WIN32)
# 非windows
ENDIF(WIN32)
PROJECT_SOURCE_DIR
这个在模板中,只在根CMakeLists.txt中使用,这个表示你的CMakeLists.txt所在的根目录下
MESSAGE
为用户显示一条消息
MESSAGE(STATUS ${PROJECT_BINARY_DIR})
MESSAGE(STATUS ${CMAKE_BINARY_DIR})
(无) = 重要消息;
STATUS = 非重要消息;
WARNING = CMake 警告, 会继续执行;
AUTHOR_WARNING = CMake 警告 (dev), 会继续执行;
SEND_ERROR = CMake 错误, 继续执行,但是会跳过生成的步骤;
FATAL_ERROR = CMake 错误, 终止所有处理过程;
LINK_DIRECTORIES
LINK_DIRECTORIES 添加需要链接的库文件目录
LINK_DIRECTORIES (DIR1 DIR2 ...)在根目录下,设置全局路径,在单个项目下,设置当前项目的库目录
IF(WIN32)
IF(CMAKE_CL_64)
SET(BASELIB_PATH ${PROJECT_SOURCE_DIR}/bin/win64)
ELSE(CMAKE_CL_64)
SET(BASELIB_PATH ${PROJECT_SOURCE_DIR}/bin/win32)
ENDIF(CMAKE_CL_64)
ENDIF(WIN32)
LINK_DIRECTORIES(${BASELIB_PATH})
设置windows下的BASELIB_PATH 根目录,这儿,默认目录是CMakeLists.txt的目录下的./bin/win64、
./bin/win64/debug、./bin/win64/release。这三个目录
CMAKE_C_FLAGS/CMAKE_CXX_FLAGS
SET命令设置CMAKE_C_FLAGS或CMAKE_CXX_FLAGS变量则是分别只针对c和c++编译器的
IF(WIN32)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /EHsc")
ELSE(WIN32)
SET(CMAKE_CXX_STANDARD 11)
SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS}" -O0 -Wall -g3 -ggdb -D_DEBUG -DDEBUG)
SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall -DNDEBUG")
ADD_COMPILE_OPTIONS(-std=c++11)
ENDIF(WIN32)
CMAKE_CXX_FLAGS_DEBUG 是设置debug的CXXFLAGS
CMAKE_CXX_FLAGS_RELEASE 是设置release的CXXFLAGS
ADD_COMPILE_OPTIONS(-std=c++11) 设置c++11
修改CMake脚本 在其中加上显示的C++11标准声明后 SET(CMAKE_CXX_STANDARD 11)
很明显 问题在于cmake没有自动识别C++11的语法功能
而低版本的g++编译器 应该也没有自动识别标准的功能
所以需要在CMake脚本中显示声明
而高版本的编译器 应该加入了对语法的自识别
ADD_DEFINITIONS
添加预处理
例如
ADD_DEFINITIONS(-DUNICODE -D_UNICODE)
ADD_DEFINITIONS(-DWIN32)
CMAKE_CL_64
windows CMAKE的内建变量,如果是true,就说明编译器的64位的,否则为32为的
IF(CMAKE_CL_64)
# 64
ELSE(CMAKE_CL_64)
# 32
ENDIF(CMAKE_CL_64)
IF(CMAKE_CL_64)
SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${PROJECT_SOURCE_DIR}/bin/win64/debug)
SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG ${PROJECT_SOURCE_DIR}/bin/win64/debug)
SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${PROJECT_SOURCE_DIR}/bin/win64/debug)
SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE ${PROJECT_SOURCE_DIR}/bin/win64/release)
SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE ${PROJECT_SOURCE_DIR}/bin/win64/release)
SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${PROJECT_SOURCE_DIR}/bin/win64/release)
ELSE(CMAKE_CL_64)
SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${PROJECT_SOURCE_DIR}/bin/win32/debug)
SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG ${PROJECT_SOURCE_DIR}/bin/win32/debug)
SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${PROJECT_SOURCE_DIR}/bin/win32/debug)
SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE ${PROJECT_SOURCE_DIR}/bin/win32/release)
SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE ${PROJECT_SOURCE_DIR}/bin/win32/release)
SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${PROJECT_SOURCE_DIR}/bin/win32/release)
ENDIF(CMAKE_CL_64)
# 设置debug/release的lib/dll/exe目录
INCLUDE_DIRECTORIES
将指定目录添加到编译器的头文件搜索路径之下,指定的目录被解释成当前源码路径的相对路径。
INCLUDE_DIRECTORIES(dir1 dir2 ...)
INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include)
CMAKE_PREFIX_PATH
CMAKE_PREFIX_PATH是以分号分隔的列表,供find_package(), find_program(), find_library(), find_file()和find_path()使用,初始为空,由用户设定
CMAKE_PREFIX_PATH是以分号分隔的列表,供find_package(), find_program(), find_library(), find_file()和find_path()使用,初始为空,由用户设定
CMAKE_MODULE_PATH是以分号分隔的列表,供include()或 find_package()使用。初始为空,由用户设定
IF(WIN32)
IF(CMAKE_CL_64)
SET(CMAKE_PREFIX_PATH "D:/Qt/5.15.2/msvc2019_64")
ELSE(CMAKE_CL_64)
SET(CMAKE_PREFIX_PATH "D:/Qt/5.15.2/msvc2019")
ENDIF(CMAKE_CL_64)
ELSE(WIN32)
SET(CMAKE_PREFIX_PATH ${QTDIR}/5.15.2)
ENDIF(WIN32)
设置Qt对应的目录
ADD_SUBDIRECTORY
ADD_SUBDIRECTORY(子文件夹名)表示对子文件夹项目进行cmake编译。
ADD_SUBDIRECTORY(dir1)
ADD_SUBDIRECTORY(dir2)
ADD_SUBDIRECTORY(dir3)
...
AUX_SOURCE_DIRECTORY
AUX_SOURCE_DIRECTORY 查找在某个路径下的所有源文件。
AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR} SOURCE_FILES)
CMAKE_CURRENT_SOURCE_DIR
CMAKE_CURRENT_SOURCE_DIR:当前正在处理的源目录的路径.
CMAKE_INCLUDE_CURRENT_DIR
#设置工程包含当前目录,非必须
SET(CMAKE_INCLUDE_CURRENT_DIR ON)
Qt 相关的设置
# REQUIRED: 意味着找不到报错并不会继续下去,FIND_PACKAGE命令是用来查找依赖包的,理想情况下,一句
# FIND_PACKAGE()把一整个依赖包的头文件包含路径、库路径、库名字、版本号等情况都获取到
FIND_PACKAGE(Qt5 COMPONENTS Core Gui Widgets Network REQUIRED)
# TARGET_LINK_LIBRARIES 链接库
# TARGET_LINK_LIBRARIES 需要放在ADD_EXECUTABLE或者ADD_LIBRARY之下
TARGET_LINK_LIBRARIES(${PRJ_NAME} Qt5::Core Qt5::Gui Qt5::Widgets Qt5::Network)
SET(CMAKE_AUTOMOC ON) # 打开全局moc
set(CMAKE_AUTOUIC ON) # 打开全局uic
set(CMAKE_AUTORCC ON) # 打开全局rcc,本示例中没有使用qrc,此句可以去掉
SET(MOC_FILES
# moc文件Q_OBJECT对应的头文件
xxx.h
)
SET(UI_FILES
# ui文件
XXX.ui
)
# 添加筛选器,Ui 为名称,UI_FILES 的文件
SOURCE_GROUP(Ui FILES ${UI_FILES})
QT5_WRAP_CPP(THIS_SOURCE_FILES ${MOC_FILES})
QT5_WRAP_UI(THIS_SOURCE_FILES ${UI_FILES})
ADD_LIBRARY
add_library(<name> [STATIC | SHARED | MODULE]
[EXCLUDE_FROM_ALL]
source1 [source2 ...])
<name> :库的名字,直接写名字即可,不要写lib,会自动加上前缀的哈。
[STATIC | SHARED | MODULE] :类型有三种。
SHARED,动态库
STATIC,静态库
MODULE,在使用 dyld 的系统有效,如果不支持 dyld,则被当作 SHARED 对待。
EXCLUDE_FROM_ALL:这个库不会被默认构建,除非有其他的组件依赖或者手
工构建。
ADD_EXECUTABLE
ADD_EXECUTABLE (<name> [WIN32] [MACOSX_BUNDLE]
[EXCLUDE_FROM_ALL]
[source1] [source2 ...])
通过指定的源文件列表构建出可执行目标文件。
二、实例
上面各个使用到的cmake中的函数,接下来做个实例
CMakeLists.txt
CMAKE_MINIMUM_REQUIRED(VERSION 3.8)
SET(PRJ_NAME RtspService)
PROJECT(${PRJ_NAME})
IF(WIN32)
SET(CMAKE_DEBUG_POSTFIX "_d")
ENDIF(WIN32)
IF(NOT CMAKE_BUILD_TYPE)
IF(WIN32)
ELSE(WIN32)
SET(CMAKE_BUILD_TYPE Debug)
ENDIF(WIN32)
ENDIF()
IF(WIN32)
SET(CMAKE_SYSTEM_VERSION 10.0)
ENDIF(WIN32)
MESSAGE(STATUS ${PROJECT_SOURCE_DIR})
MESSAGE(STATUS ${PROJECT_BINARY_DIR})
MESSAGE(STATUS ${CMAKE_BINARY_DIR})
IF(WIN32)
IF(CMAKE_CL_64)
SET(BASELIB_PATH ${PROJECT_SOURCE_DIR}/bin/win64)
ELSE(CMAKE_CL_64)
SET(BASELIB_PATH ${PROJECT_SOURCE_DIR}/bin/win32)
ENDIF(CMAKE_CL_64)
ENDIF(WIN32)
LINK_DIRECTORIES(${BASELIB_PATH})
IF(WIN32)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /EHsc")
ELSE(WIN32)
SET(CMAKE_CXX_STANDARD 11)
SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS}" -O0 -Wall -g3 -ggdb -D_DEBUG -DDEBUG)
SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall -DNDEBUG")
ADD_COMPILE_OPTIONS(-std=c++11)
ENDIF(WIN32)
IF(WIN32)
ADD_DEFINITIONS(-DUNICODE -D_UNICODE)
SET(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Zi /Od")
SET(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE} /DEBUG /OPT:REF /OPT:ICF")
SET(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /DEBUG /OPT:REF /OPT:ICF")
IF(CMAKE_CL_64)
SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${PROJECT_SOURCE_DIR}/bin/win64/debug)
SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG ${PROJECT_SOURCE_DIR}/bin/win64/debug)
SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${PROJECT_SOURCE_DIR}/bin/win64/debug)
SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE ${PROJECT_SOURCE_DIR}/bin/win64/release)
SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE ${PROJECT_SOURCE_DIR}/bin/win64/release)
SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${PROJECT_SOURCE_DIR}/bin/win64/release)
ELSE(CMAKE_CL_64)
SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${PROJECT_SOURCE_DIR}/bin/win32/debug)
SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG ${PROJECT_SOURCE_DIR}/bin/win32/debug)
SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${PROJECT_SOURCE_DIR}/bin/win32/debug)
SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE ${PROJECT_SOURCE_DIR}/bin/win32/release)
SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE ${PROJECT_SOURCE_DIR}/bin/win32/release)
SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${PROJECT_SOURCE_DIR}/bin/win32/release)
ENDIF(CMAKE_CL_64)
ENDIF(WIN32)
INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include)
IF(WIN32)
IF(CMAKE_CL_64)
SET(CMAKE_PREFIX_PATH "D:/Qt/5.15.2/msvc2019_64")
ELSE(CMAKE_CL_64)
SET(CMAKE_PREFIX_PATH "D:/Qt/5.15.2/msvc2019")
ENDIF(CMAKE_CL_64)
ELSE(WIN32)
SET(CMAKE_PREFIX_PATH ${QTDIR}/5.15.2)
ENDIF(WIN32)
ADD_SUBDIRECTORY(test/testCapture)
ADD_SUBDIRECTORY(test/testEncoder)
ADD_SUBDIRECTORY(test/testRtspServer)
tree 查看当前目录构成tree /f >> a.txt
CMakeLists.txt
│
├─bin
│ │ copy64_debug.bat
│ │ copy64_release.bat
│ │
│ ├─ffmpeg-4.4
│ │ └─win64
│ │ avcodec-58.def
│ │ avcodec-58.dll
│ │ avcodec.lib
│ │ avdevice-58.def
│ │ avdevice-58.dll
│ │ avdevice.lib
│ │ avfilter-7.def
│ │ avfilter-7.dll
│ │ avfilter.lib
│ │ avformat-58.def
│ │ avformat-58.dll
│ │ avformat.lib
│ │ avutil-56.def
│ │ avutil-56.dll
│ │ avutil.lib
│ │ ffmpeg.exe
│ │ ffplay.exe
│ │ ffprobe.exe
│ │ libavcodec.dll.a
│ │ libavdevice.dll.a
│ │ libavfilter.dll.a
│ │ libavformat.dll.a
│ │ libavutil.dll.a
│ │ libpostproc.dll.a
│ │ libswresample.dll.a
│ │ libswscale.dll.a
│ │ postproc-55.def
│ │ postproc-55.dll
│ │ postproc.lib
│ │ swresample-3.def
│ │ swresample-3.dll
│ │ swresample.lib
│ │ swscale-5.def
│ │ swscale-5.dll
│ │ swscale.lib
│ │
│ └─win64
│ ├─debug
│ │ avcodec-58.def
│ │ avcodec-58.dll
│ │ avcodec.lib
│ │ avdevice-58.def
│ │ avdevice-58.dll
│ │ avdevice.lib
│ │ avfilter-7.def
│ │ avfilter-7.dll
│ │ avfilter.lib
│ │ avformat-58.def
│ │ avformat-58.dll
│ │ avformat.lib
│ │ avutil-56.def
│ │ avutil-56.dll
│ │ avutil.lib
│ │ ffmpeg.exe
│ │ ffplay.exe
│ │ ffprobe.exe
│ │ libavcodec.dll.a
│ │ libavdevice.dll.a
│ │ libavfilter.dll.a
│ │ libavformat.dll.a
│ │ libavutil.dll.a
│ │ libpostproc.dll.a
│ │ libswresample.dll.a
│ │ libswscale.dll.a
│ │ postproc-55.def
│ │ postproc-55.dll
│ │ postproc.lib
│ │ swresample-3.def
│ │ swresample-3.dll
│ │ swresample.lib
│ │ swscale-5.def
│ │ swscale-5.dll
│ │ swscale.lib
│ │ test.h264
│ │ test.yuv
│ │ testCapture_d.exe
│ │ testCapture_d.pdb
│ │ testEncoder_d.exe
│ │ testEncoder_d.pdb
│ │ testRtspServer_d.exe
│ │ testRtspServer_d.pdb
│ │
│ └─release
│ avcodec-58.def
│ avcodec-58.dll
│ avcodec.lib
│ avdevice-58.def
│ avdevice-58.dll
│ avdevice.lib
│ avfilter-7.def
│ avfilter-7.dll
│ avfilter.lib
│ avformat-58.def
│ avformat-58.dll
│ avformat.lib
│ avutil-56.def
│ avutil-56.dll
│ avutil.lib
│ ffmpeg.exe
│ ffplay.exe
│ ffprobe.exe
│ libavcodec.dll.a
│ libavdevice.dll.a
│ libavfilter.dll.a
│ libavformat.dll.a
│ libavutil.dll.a
│ libpostproc.dll.a
│ libswresample.dll.a
│ libswscale.dll.a
│ postproc-55.def
│ postproc-55.dll
│ postproc.lib
│ swresample-3.def
│ swresample-3.dll
│ swresample.lib
│ swscale-5.def
│ swscale-5.dll
│ swscale.lib
│
├─include
│ │ CaptureCfg.h
│ │ RTSPCfg.h
│ │
│ ├─libavcodec
│ │ ac3_parser.h
│ │ adts_parser.h
│ │ avcodec.h
│ │ avdct.h
│ │ avfft.h
│ │ bsf.h
│ │ codec.h
│ │ codec_desc.h
│ │ codec_id.h
│ │ codec_par.h
│ │ d3d11va.h
│ │ dirac.h
│ │ dv_profile.h
│ │ dxva2.h
│ │ jni.h
│ │ mediacodec.h
│ │ packet.h
│ │ qsv.h
│ │ vaapi.h
│ │ vdpau.h
│ │ version.h
│ │ videotoolbox.h
│ │ vorbis_parser.h
│ │ xvmc.h
│ │
│ ├─libavdevice
│ │ avdevice.h
│ │ version.h
│ │
│ ├─libavfilter
│ │ avfilter.h
│ │ buffersink.h
│ │ buffersrc.h
│ │ version.h
│ │
│ ├─libavformat
│ │ avformat.h
│ │ avio.h
│ │ version.h
│ │
│ ├─libavutil
│ │ adler32.h
│ │ aes.h
│ │ aes_ctr.h
│ │ attributes.h
│ │ audio_fifo.h
│ │ avassert.h
│ │ avconfig.h
│ │ avstring.h
│ │ avutil.h
│ │ base64.h
│ │ blowfish.h
│ │ bprint.h
│ │ bswap.h
│ │ buffer.h
│ │ camellia.h
│ │ cast5.h
│ │ channel_layout.h
│ │ common.h
│ │ cpu.h
│ │ crc.h
│ │ des.h
│ │ dict.h
│ │ display.h
│ │ dovi_meta.h
│ │ downmix_info.h
│ │ encryption_info.h
│ │ error.h
│ │ eval.h
│ │ ffversion.h
│ │ fifo.h
│ │ file.h
│ │ film_grain_params.h
│ │ frame.h
│ │ hash.h
│ │ hdr_dynamic_metadata.h
│ │ hmac.h
│ │ hwcontext.h
│ │ hwcontext_cuda.h
│ │ hwcontext_d3d11va.h
│ │ hwcontext_drm.h
│ │ hwcontext_dxva2.h
│ │ hwcontext_mediacodec.h
│ │ hwcontext_opencl.h
│ │ hwcontext_qsv.h
│ │ hwcontext_vaapi.h
│ │ hwcontext_vdpau.h
│ │ hwcontext_videotoolbox.h
│ │ hwcontext_vulkan.h
│ │ imgutils.h
│ │ intfloat.h
│ │ intreadwrite.h
│ │ lfg.h
│ │ log.h
│ │ lzo.h
│ │ macros.h
│ │ mastering_display_metadata.h
│ │ mathematics.h
│ │ md5.h
│ │ mem.h
│ │ motion_vector.h
│ │ murmur3.h
│ │ opt.h
│ │ parseutils.h
│ │ pixdesc.h
│ │ pixelutils.h
│ │ pixfmt.h
│ │ random_seed.h
│ │ rational.h
│ │ rc4.h
│ │ replaygain.h
│ │ ripemd.h
│ │ samplefmt.h
│ │ sha.h
│ │ sha512.h
│ │ spherical.h
│ │ stereo3d.h
│ │ tea.h
│ │ threadmessage.h
│ │ time.h
│ │ timecode.h
│ │ timestamp.h
│ │ tree.h
│ │ twofish.h
│ │ tx.h
│ │ version.h
│ │ video_enc_params.h
│ │ xtea.h
│ │
│ ├─libpostproc
│ │ postprocess.h
│ │ version.h
│ │
│ ├─libswresample
│ │ swresample.h
│ │ version.h
│ │
│ └─libswscale
│ swscale.h
│ version.h
│
├─src
└─test
├─testCapture
│ CMakeLists.txt
│ main.cpp
│
├─testEncoder
│ CMakeLists.txt
│ main.cpp
│
└─testRtspServer
│ CMakeLists.txt
│ main.cpp
│
├─3rdpart
│ └─md5
│ COPYING
│ md5.hpp
│
├─net
│ Acceptor.cpp
│ Acceptor.h
│ BufferReader.cpp
│ BufferReader.h
│ BufferWriter.cpp
│ BufferWriter.h
│ Channel.h
│ EpollTaskScheduler.cpp
│ EpollTaskScheduler.h
│ EventLoop.cpp
│ EventLoop.h
│ log.h
│ Logger.cpp
│ Logger.h
│ MemoryManager.cpp
│ MemoryManager.h
│ NetInterface.cpp
│ NetInterface.h
│ Pipe.cpp
│ Pipe.h
│ RingBuffer.h
│ SelectTaskScheduler.cpp
│ SelectTaskScheduler.h
│ Socket.h
│ SocketUtil.cpp
│ SocketUtil.h
│ TaskScheduler.cpp
│ TaskScheduler.h
│ TcpConnection.cpp
│ TcpConnection.h
│ TcpServer.cpp
│ TcpServer.h
│ TcpSocket.cpp
│ TcpSocket.h
│ Timer.cpp
│ Timer.h
│ Timestamp.cpp
│ Timestamp.h
│
└─xop
AACSource.cpp
AACSource.h
DigestAuthentication.cpp
DigestAuthentication.h
G711ASource.cpp
G711ASource.h
H264Parser.cpp
H264Parser.h
H264Source.cpp
H264Source.h
H265Source.cpp
H265Source.h
media.h
MediaSession.cpp
MediaSession.h
MediaSource.h
rtp.h
RtpConnection.cpp
RtpConnection.h
rtsp.h
RtspConnection.cpp
RtspConnection.h
RtspMessage.cpp
RtspMessage.h
RtspPusher.cpp
RtspPusher.h
RtspServer.cpp
RtspServer.h
VP8Source.cpp
VP8Source.h
test/testCapture CMakeLists.txt 写法,test/testEncoder类似
CMAKE_MINIMUM_REQUIRED(VERSION 3.8)
IF(WIN32)
CMAKE_POLICY(SET CMP0020 NEW)
ENDIF(WIN32)
SET(PRJ_NAME testCapture)
PROJECT(${PRJ_NAME})
ADD_DEFINITIONS(-DVLCMEDIA_LIBRARY_EXPORT)
ADD_DEFINITIONS(-DWIN32)
AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR} SOURCE_FILES)
MESSAGE(STATUS ${PROJECT_SOURCE_DIR})
MESSAGE(STATUS ${PROJECT_BINARY_DIR})
MESSAGE(STATUS ${CMAKE_BINARY_DIR})
SET(INCLUDE_PATHS
${CMAKE_CURRENT_SOURCE_DIR}/../../include
${CMAKE_CURRENT_SOURCE_DIR}/../../
${CMAKE_CURRENT_SOURCE_DIR}/
)
INCLUDE_DIRECTORIES(${3DRLIB_INCLUDE_DIR} ${INCLUDE_PATHS})
LINK_DIRECTORIES(${3DRLIB_INCLUDE_DIR})
FILE(GLOB INCLUDE_FILES "${CMAKE_CURRENT_SOURCE_DIR}/*.h")
FILE(GLOB SRC_FILES ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp)
SET(THIS_SOURCE_FILES ${INCLUDE_FILES} ${SOURCE_FILES} ${SRC_FILES})
SET(CMAKE_INCLUDE_CURRENT_DIR ON)
#FIND_PACKAGE(Qt5 COMPONENTS Core Gui Widgets Network REQUIRED)
#SET(MOC_FILES )
#QT5_WRAP_CPP(THIS_SOURCE_FILES ${MOC_FILES})
# 添加筛选器
SET(MAIN
main.cpp
)
SOURCE_GROUP(Main FILES ${MAIN})
ADD_EXECUTABLE(${PRJ_NAME}
${THIS_SOURCE_FILES}
${Main}
)
TARGET_LINK_LIBRARIES(${PRJ_NAME} avcodec)
TARGET_LINK_LIBRARIES(${PRJ_NAME} avdevice)
TARGET_LINK_LIBRARIES(${PRJ_NAME} avfilter)
TARGET_LINK_LIBRARIES(${PRJ_NAME} avformat)
TARGET_LINK_LIBRARIES(${PRJ_NAME} avutil)
TARGET_LINK_LIBRARIES(${PRJ_NAME} postproc)
TARGET_LINK_LIBRARIES(${PRJ_NAME} swresample)
TARGET_LINK_LIBRARIES(${PRJ_NAME} swscale)
#TARGET_LINK_LIBRARIES(${PRJ_NAME} Qt5::Core Qt5::Gui Qt5::Widgets Qt5::Network)
IF(WIN32)
SET_TARGET_PROPERTIES(${PRJ_NAME} PROPERTIES DEBUG_POSTFIX _d)
SET_TARGET_PROPERTIES(${PRJ_NAME} PROPERTIES LINK_FLAGS "/OPT:NOREF /OPT:NOICF")
ENDIF(WIN32)
test/testRtspServer CMakeLists.txt, 这个稍微复杂点,可以参考这个
CMAKE_MINIMUM_REQUIRED(VERSION 3.8)
IF(WIN32)
CMAKE_POLICY(SET CMP0020 NEW)
ENDIF(WIN32)
SET(PRJ_NAME testRtspServer)
PROJECT(${PRJ_NAME})
ADD_DEFINITIONS(-DVLCMEDIA_LIBRARY_EXPORT)
ADD_DEFINITIONS(-DWIN32)
AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR} SOURCE_FILES)
SET(INCLUDE_PATHS
${CMAKE_CURRENT_SOURCE_DIR}/../../include
${CMAKE_CURRENT_SOURCE_DIR}/../../
${CMAKE_CURRENT_SOURCE_DIR}/3rdpart
${CMAKE_CURRENT_SOURCE_DIR}/xop
${CMAKE_CURRENT_SOURCE_DIR}/net
${CMAKE_CURRENT_SOURCE_DIR}/
)
INCLUDE_DIRECTORIES(${3DRLIB_INCLUDE_DIR} ${INCLUDE_PATHS})
LINK_DIRECTORIES(${3DRLIB_INCLUDE_DIR})
FILE(GLOB INCLUDE_FILES "${CMAKE_CURRENT_SOURCE_DIR}/*.h")
FILE(GLOB SRC_FILES ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp)
SET(THIS_SOURCE_FILES ${INCLUDE_FILES} ${SOURCE_FILES} ${SRC_FILES})
SET(CMAKE_INCLUDE_CURRENT_DIR ON)
#FIND_PACKAGE(Qt5 COMPONENTS Core Gui Widgets Network REQUIRED)
#SET(MOC_FILES )
#QT5_WRAP_CPP(THIS_SOURCE_FILES ${MOC_FILES})
# 添加筛选器
SET(3RDPART
3rdpart/md5/md5.hpp
)
SET(NET
net/Acceptor.cpp
net/Acceptor.h
net/BufferReader.cpp
net/BufferReader.h
net/BufferWriter.cpp
net/BufferWriter.h
net/Channel.h
net/EpollTaskScheduler.cpp
net/EpollTaskScheduler.h
net/EventLoop.cpp
net/EventLoop.h
net/log.h
net/Logger.cpp
net/Logger.h
net/MemoryManager.cpp
net/MemoryManager.h
net/NetInterface.cpp
net/NetInterface.h
net/Pipe.cpp
net/Pipe.h
net/RingBuffer.h
net/SelectTaskScheduler.cpp
net/SelectTaskScheduler.h
net/Socket.h
net/SocketUtil.cpp
net/SocketUtil.h
net/TaskScheduler.cpp
net/TaskScheduler.h
net/TcpConnection.cpp
net/TcpConnection.h
net/TcpServer.cpp
net/TcpServer.h
net/TcpSocket.cpp
net/TcpSocket.h
net/Timer.cpp
net/Timer.h
net/Timestamp.cpp
net/Timestamp.h
)
SET(XOP
xop/AACSource.cpp
xop/AACSource.h
xop/DigestAuthentication.cpp
xop/DigestAuthentication.h
xop/G711ASource.cpp
xop/G711ASource.h
xop/H264Parser.cpp
xop/H264Parser.h
xop/H264Source.cpp
xop/H264Source.h
xop/H265Source.cpp
xop/H265Source.h
xop/media.h
xop/MediaSession.cpp
xop/MediaSession.h
xop/MediaSource.h
xop/rtp.h
xop/RtpConnection.cpp
xop/RtpConnection.h
xop/rtsp.h
xop/RtspConnection.cpp
xop/RtspConnection.h
xop/RtspMessage.cpp
xop/RtspMessage.h
xop/RtspPusher.cpp
xop/RtspPusher.h
xop/RtspServer.cpp
xop/RtspServer.h
xop/VP8Source.cpp
xop/VP8Source.h
)
SET(MAIN
main.cpp
)
SOURCE_GROUP(3rdpart FILES ${3RDPART})
SOURCE_GROUP(net FILES ${NET})
SOURCE_GROUP(xop FILES ${XOP})
SOURCE_GROUP(main FILES ${MAIN})
ADD_EXECUTABLE(${PRJ_NAME}
${THIS_SOURCE_FILES}
${3RDPART}
${NET}
${XOP}
${MAIN}
)
#TARGET_LINK_LIBRARIES(${PRJ_NAME} Qt5::Core Qt5::Gui Qt5::Widgets Qt5::Network)
IF(WIN32)
SET_TARGET_PROPERTIES(${PRJ_NAME} PROPERTIES DEBUG_POSTFIX _d)
SET_TARGET_PROPERTIES(${PRJ_NAME} PROPERTIES LINK_FLAGS "/OPT:NOREF /OPT:NOICF")
ENDIF(WIN32)
三、结束语
上面的示例,代码和灵感来源与下面,以后的项目尽量统一使用VS+Qt+CMAKE
- 技术视频参考: https://ke.qq.com/course/3202131?flowToken=1040952
- 实例博客地址: 基于Qt和ffmpeg的抓屏rtsp服务(二)
- 代码地址:gitee地址