在Linux平台下研发,我们大多数的项目管理工具是Makefile,最近火起来的cmake工具大有取代make的趋势,因为它是跨平台的,可以用cmake生成vs专用的vsproj文件,也可以使用cmake生成Linux平台下的makefile文件,下面开始最简单的cmake使用,首先做一点知识预备:
我们执行make的时候需要有Makefile文件存在,做支持;cmake同样有这样的需求,cmake要想能够成功运行需要有CMakeLists.txt文件存在,做支持。cmake中有自己的环境变量,如CMAKE_SOURCE_DIR指的就是存放CMakeLists.txt文件的路径。为了大型项目编译方便,一般情况我们为整个项目创建一个CMakeLists.txt文件,然后为每个子项目创建*.cmake文件,然后将这些cmake文件引入到CMakeLists.txt文件中。还有cmake最终能编译是因为它生成了Makefile文件,只不过生成的不止是Makefile文件还有一些附带的临时文件,所以我们一般创建一个build文件夹来执行cmake命令,以防这些临时文件污染源代码。
在目录src下创建Hello.cpp文件,然后建立cmake工具使用的CMakeLists.txt文件,CMakeLists.txt文件内容如下:
project(Hello)
add_executable(Hello Hello.cpp)
在src目录下创建build文件夹(执行cmake会生成cmake专用文件,创建该文件夹的目的是防止cmake垃圾影响源代码)
在build文件夹中执行"cmake .."即可生成编译项目所需的Makefile文件
生成makefile文件后,即可按照我们日常使用Makefile那样生成最终的可执行程序。
上面介绍的是cmake的基本入门使用,接下来我们介绍一点复杂的可用于大型项目的cmake模板,首先我们创建一个CMakeLists.txt文件,然后为每个子项目创建一个对应的.cmake 文件,最后将这些cmake文件包含在CMakeLists.txt中:
CMakeLists.txt:
cmake_minimum_required(VERSION 2.8.12)
project(project_name C CXX)
set(CMAKE_BUILD Debug)
set(project_name_VERSION_MAJOR 1)
set(project_name_VERSION_MINOR 0)
set(root_dir ${CMAKE_SOURCE_DIR})
set(proto_dir ${root_dir}/proto)
set(rpc_dir ${root_dir}/rpc)
set(utils_dir ${root_dir}/utils)
if(NOT lib_path)
set(lib_path ${root_dir}/lib)
endif()
if(NOT runtime_path)
set(runtime_path ${root_dir}/bin)
endif()
set(LIBRARY_OUTPUT_PATH ${lib_path})
set(EXECUTABLE_OUTPUT_PATH ${runtime_path})
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
set(include_dirs ${rpc_dir} ${bsm_include_dir} ${module_dir} ${utils_dir} ${bsm_monitor_dir} ${bsm_node_dir})
include(cmake/project_name_sdk.cmake)
include(cmake/project_name_monitor.cmake)
include(cmake/project_name_node.cmake)
include(cmake/project_name_test.cmake)
include(cmake/project_name_video_decoder.cmake)
video_decoder_demuxer.cmake:
#specify src file
set(source_file_list
${project_name_video_decoder}/gb28181/project_name_video_decoder_demuxer.cpp
${project_name_video_decoder}/gb28181/project_name_video_decoder_demuxer2.cpp
)
set(libs_ffmpeg4.0_path /usr/local/ffmpeg/lib)
set(libs_ffmpeg4.0
${libs_ffmpeg4.0_path}/libavformat.so
${libs_ffmpeg4.0_path}/libavcodec.so
${libs_ffmpeg4.0_path}/libavfilter.so
${libs_ffmpeg4.0_path}/libavutil.so
${libs_ffmpeg4.0_path}/libswscale.so
${libs_ffmpeg4.0_path}/libavdevice.so
${libs_ffmpeg4.0_path}/libswresample.so
)
#specity target
add_executable(demuxer_test_exe ${root_dir}/test/project_name_video_decoder_demuxer_test.cpp)
add_library(static_video_decoder_demuxer STATIC ${source_file_list})
add_library(shared_video_decoder_demuxer SHARED ${source_file_list})
set_target_properties(static_video_decoder_demuxer PROPERTIES OUTPUT_NAME "static_video_decoder_demuxer")
set_target_properties(shared_video_decoder_demuxer PROPERTIES OUTPUT_NAME "shared_video_decoder_demuxer")
#specify include dir
include_directories(${project_name_video_decoder})
include_directories(/usr/local/ffmpeg/include/)
#specify library dir
link_directories(/usr/local/ffmpeg/lib)
link_directories(${root_dir}/lib)
#specify library
target_link_libraries(demuxer_test_exe static_video_decoder_demuxer ${libs_ffmpeg4.0})
target_link_libraries(static_video_decoder_demuxer ${libs_ffmpeg4.0})
target_link_libraries(shared_video_decoder_demuxer ${libs_ffmpeg4.0})