CMake --- .cmake文件的编写(find_package)
.cmake文件的编写
1.ffmepgConfig.cmake编写
if(CMAKE_VERSION VERSION_LESS 3.10) message(FATAL_ERROR "CMake 3.10 is required by Findffmpeg.cmake") endif() set(ffmpeg_VERSION 6.1) set(HEADS_PATH ${PROJECT_SOURCE_DIR}/external/ffmpeg/prebuild/include) set(LIB_PATH ${PROJECT_SOURCE_DIR}/external/ffmpeg/prebuild/lib/${CMAKE_SYSTEM_PROCESSOR}/linux/lib64) find_path(ffmpeg_INCLUDE_DIR NAMES libavcodec/avcodec.h HINTS ${HEADS_PATH} ) find_library(ffmpeg_LIBRARY NAMES avfilter avformat avcodec avutil swresample swscale avdevice HINTS ${LIB_PATH} ) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(ffmpeg FOUND_VAR ffmpeg_FOUND REQUIRED_VARS ffmpeg_LIBRARY ffmpeg_INCLUDE_DIR VERSION_VAR ffmpeg_VERSION ) if(ffmpeg_FOUND) add_library(ffmpeg UNKNOWN IMPORTED) set_target_properties(ffmpeg PROPERTIES IMPORTED_LOCATION "${ffmpeg_LIBRARY}" INTERFACE_COMPILE_OPTIONS "${ffmpeg_DEFINITIONS}" INTERFACE_INCLUDE_DIRECTORIES "${ffmpeg_INCLUDE_DIR}" ) endif()
2.使用方法:
CMAKE_MODULE_PATH:设置.cmake的查找路径
find_package:找module
例:
cmake_minimum_required(VERSION 3.9) project(test) set(CMAKE_BUILD_TYPE Debug) set(CMAKE_C_FLAGS "$ENV{CFLAGS} -O2 -Wall -pthread ") set(CMAKE_CXX_FLAGS "$ENV{CFLAGS} -O2 -Wall -pthread -std=c++11 -std=gnu++11") #设置module的查找路径 list(APPEND CMAKE_MODULE_PATH "/your/module/path") #找module,找不到报错 find_package(ffmpeg REQUIRED) add_definitions(-fpermissive) add_executable(haha main.cpp) target_link_libraries(haha ffmpeg)
3. .cmake用到的一些函数说明:
1、find_path
find_path 一般用于在某个目录下查找一个或者多个头文件,命令的执行结果会保存到 <VAR> 中。同时命令的执行结果也会默认缓存到 CMakeCache.txt 中。
(1) 格式
find_path 的格式如下:
find_path ( <VAR> NAMES name1 [name2 ...] [HINTS [path | ENV var]... ] [PATHS [path | ENV var]... ] [NO_CACHE] [REQUIRED] )
选项解析:
<VAR>:用于保存命令的执行结果
NAMES:要查找的头文件
HINTS | PATHS
HINTS:先搜索指定路径,后搜索系统路径
PATHS:先搜索系统路径,后搜索
NO_CACHE:搜索结果将存储在普通变量中而不是缓存条目(即CMakeCache.txt)中
REQUIRED:如果没有找到指定头文件,就出发错误提示,变量会设为 <VAR>-NOTFOUND
执行结果:
查找成功时,会向变量<VAR>中添加成功找到头文件的目录,如果在某个路径下查找多个头文件,只要查找到多个头文件中的某一个,也算执行成功。
注意:
虽然HINTS / PATHS后面可以跟多条路径,但是每次只会向变量中<VAR>添加一个目录,那就是成功找到头文件的目录。
2、find_library
find_library 一般直接去查找依赖库文件,和find_package 不一样,find_package 找的是 .cmake 文件,而find_library 直接找 .so 或者 .a 文件。
和 find_path 一样,命令的执行结果会默认缓存到 CMakeCache.txt 中。
(1) 格式
相关选项解析可以参考 find_path
find_library ( <LIBRARY_NAME> NAMES name1 [name2 ...] [NAMES_PER_DIR] [HINTS [path | ENV var]... ] [PATHS [path | ENV var]... ] [NO_CACHE] [REQUIRED] )
选项解析:
LIBRARY_NAME:库名。允许两种形式,前缀+库名+后缀、只有库名。
NAMES_PER_DIR:表示一个名称遍历查找一次。而不是在某个路径下,查看是否存在多个库
执行结果:
查找成功时,会向变量<LIBRARY_NAME>中添加成功找到头文件的库文件(包含完整路径),如果在某个路径下查找多个头文件,只要查找到多个头文件中的某一个,也算执行成功。
注意:
虽然HINTS / PATHS后面可以跟多条路径,但是每次只会向变量中<VAR>添加一个目录,那就是成功找到头文件的目录。