相比于手动写Makefile,使用cmake再方便不过了,简单的几行命令就可以自动化生成Makefile,另外对于linux和window都支持。下面以一个实例来展示cmake的便捷。
cmake也是一种脚本语言,脚本文件名称必须为CMakelists.txt。假如一个项目的原代码结构如下:
----VideoProcess
|----main.cpp
|----CMakeLists.txt
|----videoparse
|----videoparse.h
|----videoparse.cpp
|----CMakeLists.txt
|----lib
|----build
其中videoparse子目录中的文件是为了生成一个动态库videoparse.so,main.cpp中会调用动态库videoparse.so生成可执行文件VideoProcess.
对于这种每个子目录中的源码文件需要独立生成一个库或者可执行文件的情况,通常在每个子目录中放置一个CMakeLists.txt,这样每个模块可以独立生成。videoparse目录中的CMakelists.txt内容如下:
cmake_minimum_required(VERSION 3.4)
message(STATUS "sub cmakelists.txt") #打印一些你想了解的信息
message(STATUS ${PROJECT_SOURCE_DIR}) #
add_compile_options(-g -fpic)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/lib)#设置库的输出目录
link_directories(/usr/local/lib) #依赖库查找路径
add_library(videoparse SHARED videoparse.cpp) #生成库,SHARED动态库,STATIC静态库
target_link_libraries(videoparse avutil avcodec avformat)#设置依赖库的情况。
根目录下的CMakeLists.txt内容如下:
cmake_minimum_required(VERSION 3.4)
project(VideoProcess) #设置项目名称
message(STATUS "root cmakelists.txt")
message(STATUS ${PROJECT_SOURCE_DIR})
add_subdirectory(${PROJECT_SOURCE_DIR}/videoparse)#递归执行子目录中的CMakeLists.txt
include_directories(${PROJECT_SOURCE_DIR}/videoparse) #查找动态库的头文件
link_directories(/usr/local/lib ${PROJECT_SOURCE_DIR}/lib)#设置依赖库查找路径
add_executable(VideoProcess main.cpp) #生成可执行程序
target_link_libraries(VideoProcess videoparse) #设置依赖库
进入到build目录执行cmake .. 在build目录中会生成对应的Makefile,然后执行make即可。
cmake 参考文档:
- https://github.com/Wigner-GPU-Lab/Teaching/tree/master/CMake/Lesson1_CompileC_CPP
- https://github.com/chaneyzorn/CMake-tutorial
- https://github.com/zdzhaoyong/PICMake
- https://github.com/xizhibei/blog/issues