版权声明:本文为博主原创文章,转载请注明源地址。 https://cloud.tencent.com/developer/article/1433557
libjpeg-turbo的安装包没有提供用于CONFIG模式查找包(find_package)的cmake脚本,如果cmake脚本中要查找libjpeg-turbo库,就得自己写脚本。
于是我参照cmake 查找标准libjpeg库 的Module FindJPEG源码的写法实现了libjpeg-turbo的Module FindTurboJPEG.cmake。
为了更方便引用libjpeg-turbo,module中不仅提供了传统的变量方式TURBOJPEG_INCLUDE_DIR
,TURBOJPEG_LIBRARY
提供libjpeg-turbo的信息,还提供import target:turbojpep
,turbojpeg-static
# 通过查找turbojpeg.h定位libjpeg-turbo的include文件夹位置
find_path(TURBOJPEG_INCLUDE_DIR turbojpeg.h)
set(TURBOJPEG_NAMES ${TURBOJPEG_NAMES} turbojpeg libturbojpeg)
find_library(TURBOJPEG_LIBRARY NAMES ${TURBOJPEG_NAMES} )
# handle the QUIETLY and REQUIRED arguments and set TURBOJPEG_FOUND to TRUE if
# all listed variables are TRUE
include(FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(TURBOJPEG DEFAULT_MSG TURBOJPEG_LIBRARY TURBOJPEG_INCLUDE_DIR)
if(TURBOJPEG_FOUND)
# for compatility of find_dependency
set (TurboJPEG_FOUND TRUE)
# Create imported target turbojpeg
add_library(turbojpep SHARED IMPORTED)
# import target中指定include文件夹
set_target_properties(turbojpep PROPERTIES
IMPORTED_LINK_INTERFACE_LANGUAGES "C"
INTERFACE_INCLUDE_DIRECTORIES "${TURBOJPEG_INCLUDE_DIR}"
IMPORTED_LOCATION "${TURBOJPEG_LIBRARY}"
)
if(MSVC)
set(_stati_library_name ${CMAKE_STATIC_LIBRARY_PREFIX}turbojpeg-static${CMAKE_STATIC_LIBRARY_SUFFIX})
else()
set(_stati_library_name ${CMAKE_STATIC_LIBRARY_PREFIX}turbojpeg${CMAKE_STATIC_LIBRARY_SUFFIX})
endif()
# 查找libjpeg-turbo静态库
find_library(TURBOJPEG_LIBRARY_STATIC ${_stati_library_name})
# 如果找到静态库,则创建turbojpeg-static target
if(TURBOJPEG_LIBRARY_STATIC)
# Create imported target turbojpeg-static
add_library(turbojpeg-static STATIC IMPORTED)
# import target中指定include文件夹
set_target_properties(turbojpeg-static PROPERTIES
IMPORTED_LINK_INTERFACE_LANGUAGES "C"
INTERFACE_INCLUDE_DIRECTORIES "${TURBOJPEG_INCLUDE_DIR}"
IMPORTED_LOCATION "${TURBOJPEG_LIBRARY_STATIC}"
)
message(STATUS "TURBOJPEG_LIBRARY_STATIC=${TURBOJPEG_LIBRARY_STATIC}")
else()
message(STATUS "NOT FOUND jpeg-turbo static library")
endif()
unset(_stati_library_name)
endif()
mark_as_advanced(TURBOJPEG_LIBRARY TURBOJPEG_INCLUDE_DIR )
import target引用示例:
# 需要将FindTurboJPEG.cmake的位置加入CMAKE_PREFIX_PATH,cmake才能找到
find_package(TurboJPEG REQUIRED)
## 优先使用静态库
if(TARGET turbojpeg-static)
set (_turbojpeg_target "turbojpeg-static")
else()
set (_turbojpeg_target "turbojpeg")
endif()
# 因为import target已经包含了libjpeg-turbo的include信息,
# 所以会自动传递被引入的项目mytarget,所以mytarget 不必再单独添加include_directories
target_link_libraries(mytarget ${_turbojpeg_target})
FindTurboJPEG.cmake
应用的完整示例参见:
https://gitee.com/l0km/jpegwrapper/blob/master/jpegwrapper/CMakeLists.txt
FindTurboJPEG.cmake
源码的gitee仓库存储位置:
https://gitee.com/l0km/jpegwrapper/blob/master/cmake/Modules/FindTurboJPEG.cmake