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>添加一个目录,那就是成功找到头文件的目录。

原文链接::https://blog.csdn.net/challenglistic/article/details/130169830
 
 
 
 
 
 
#接口库的方式导入ffmpeg
set(FFMPEG_LIB_PATH ${PROJECT_SOURCE_DIR}/external/ffmpeg/prebuild/lib/${CMAKE_SYSTEM_PROCESSOR}/linux/lib64)

set(FFMPEG_LIBS
"\
${FFMPEG_LIB_PATH}/libavfilter.so;\
${FFMPEG_LIB_PATH}/libavformat.so;\
${FFMPEG_LIB_PATH}/libavcodec.so;\
${FFMPEG_LIB_PATH}/libavutil.so;\
${FFMPEG_LIB_PATH}/libswresample.so;\
${FFMPEG_LIB_PATH}/libswscale.so;\
${FFMPEG_LIB_PATH}/libavdevice.so\
")

#x86_64平台编译的ffmpeg依赖libx264-dev libx265-dev库
string(FIND "${CMAKE_SYSTEM_PROCESSOR}" "x86_64" NEED_X264)
if(NEED_X264 GREATER -1)
    string(APPEND FFMPEG_LIBS ";${FFMPEG_LIB_PATH}/libx264.so;${FFMPEG_LIB_PATH}/libx265.so")
endif()

add_library(ffmpeg INTERFACE IMPORTED GLOBAL)

set_target_properties(ffmpeg PROPERTIES
INTERFACE_LINK_LIBRARIES
"${FFMPEG_LIBS}"
)

set_target_properties(ffmpeg PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES
"${PROJECT_SOURCE_DIR}/external/ffmpeg/prebuild/include"
)
posted on 2024-04-30 14:55  林西索  阅读(18)  评论(0编辑  收藏  举报