CMakeList 中 find_library 用法

在CMakeList中,有时需要 寻找 三方库,通常是使用 find_libaray 来进行查找的。

  • find_library(名称1 [path1 path2 …])
  • 作用:用于查找库。
    VAR 创建名为的缓存条目以存储此命令的结果。
    如果找到了库,结果将存储在变量中,除非清除变量,否则将不会重复搜索。
    如果什么也没找到,结果将是-NOTFOUND。
    REQUIRED如果未找到任何内容,该选项将停止处理并显示一条错误消息,
    否则,下次使用相同的变量调 用find_library时,将再次尝试搜索。
  • NAMES 为库指定一个或多个可能的名称。
  • HINTS, PATHS 除了默认位置,还指定要搜索的目录。该子选项读取系统环境变量的路径。
  • DOC 指定缓存条目的文档字符串。
  • REQUIRED 如果未找到任何内容,则停止处理并显示错误消息。

Example1 :
比如,我们经常会查找三方库。我们以VTK的中CMakeList 为例,如下
FindGLEW.cmake

find_library(GLEW_LIBRARY
  NAMES GLEW glew32
  DOC "glew library")

# ${CMAKE_CURRENT_LIST_DIR}/lib/Release 目录下,查找gpgjpeg库文件。
find_library(GPUJPEG_LIBRARY NAMES gpujpeg
             HINTS ${CMAKE_CURRENT_LIST_DIR}/lib/Release)
find_library(GPUJPEG_LIBRARY_RELEASE NAMES gpujpeg
             HINTS ${CMAKE_CURRENT_LIST_DIR}/lib/Release)
find_library(GPUJPEG_LIBRARY_DEBUG NAMES gpujpeg
             HINTS ${CMAKE_CURRENT_LIST_DIR}/lib/Debug)

# 将GPUJPEG_LIBRARY 这个变量设置在THIRDPARTY_LIBRARIES 中 
set(THIRDPARTY_LIBRARIES ${GPUJPEG_LIBRARY})
set(THIRDPARTY_LIBRARIES_RELEASE ${GPUJPEG_LIBRARY_RELEASE})
set(THIRDPARTY_LIBRARIES_DEBUG ${GPUJPEG_LIBRARY_DEBUG})

# 设置 TARGETS_GPUJPEG 路径文件,如果包含这个路径的文件,则包含这个*.cmake
set (TARGETS_GPUJPEG "${CMAKE_CURRENT_LIST_DIR}/cmake/gpujpeg-targets.cmake")
if(EXISTS ${TARGETS_GPUJPEG})
  include(${TARGETS_GPUJPEG})
endif()

参考:

要编写一个可被其他 CMake 文件 `find_package()` 调用的包,需要完成以下步骤: 1. 创建一个文件夹用于存放你的包,例如 `MyPackage`。 2. 在 `MyPackage` 文件夹中创建 `CMakeLists.txt` 文件,用于编写构建逻辑。 3. 在 `MyPackage` 文件夹中创建一个 `MyPackageConfig.cmake.in` 文件,该文件定义了包的名称、版本号、安装路径等信息。 4. 在 `MyPackage` 文件夹中创建一个 `MyPackageTargets.cmake` 文件,该文件定义了包的编译目标。 5. 在 `MyPackage` 文件夹中创建一个 `include` 文件夹,用于存放包的公共头文件。 6. 在 `MyPackage` 文件夹中创建一个 `src` 文件夹,用于存放包的源代码。 下面是一个示例 `CMakeLists.txt` 文件: ```cmake cmake_minimum_required(VERSION 3.5) project(MyPackage VERSION 1.0.0 LANGUAGES CXX) # 设置包的安装路径 if(NOT CMAKE_INSTALL_PREFIX) set(CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}/install" CACHE PATH "Install path prefix" FORCE) endif() # 添加头文件路径 include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include) # 添加源码路径 add_subdirectory(src) # 安装包的配置文件 configure_file( "${CMAKE_CURRENT_SOURCE_DIR}/MyPackageConfig.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/MyPackageConfig.cmake" @ONLY ) # 安装包的配置文件和版本文件 install( FILES "${CMAKE_CURRENT_BINARY_DIR}/MyPackageConfig.cmake" "${CMAKE_CURRENT_BINARY_DIR}/MyPackageConfigVersion.cmake" DESTINATION lib/cmake/MyPackage ) # 安装包的公共头文件 install( DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/include/" DESTINATION include ) # 导出包的编译目标 install( EXPORT MyPackageTargets FILE MyPackageTargets.cmake NAMESPACE MyPackage:: DESTINATION lib/cmake/MyPackage ) ``` `MyPackageConfig.cmake.in` 文件示例: ```cmake @PACKAGE_INIT@ set_and_check(MYPACKAGE_INCLUDE_DIR "@PACKAGE_INCLUDE_DIR@") set_and_check(MYPACKAGE_LIBRARY_DIR "@PACKAGE_LIBRARY_DIR@") set_and_check(MYPACKAGE_LIBRARIES "@PACKAGE_LIBRARIES@") set_and_check(MYPACKAGE_VERSION "@PACKAGE_VERSION@") include("${CMAKE_CURRENT_LIST_DIR}/MyPackageTargets.cmake") # 导出包的头文件路径和编译目标 set(MYPACKAGE_INCLUDE_DIRS "${MYPACKAGE_INCLUDE_DIR}") set(MYPACKAGE_TARGETS MyPackage::MyPackage) # 导出包的版本信息 set(MYPACKAGE_VERSION_MAJOR "@PACKAGE_VERSION_MAJOR@") set(MYPACKAGE_VERSION_MINOR "@PACKAGE_VERSION_MINOR@") set(MYPACKAGE_VERSION_PATCH "@PACKAGE_VERSION_PATCH@") set(MYPACKAGE_VERSION "${MYPACKAGE_VERSION_MAJOR}.${MYPACKAGE_VERSION_MINOR}.${MYPACKAGE_VERSION_PATCH}") ``` `MyPackageTargets.cmake` 文件示例: ```cmake add_library(MyPackage::MyPackage INTERFACE IMPORTED) set_target_properties(MyPackage::MyPackage PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${MYPACKAGE_INCLUDE_DIR}" INTERFACE_LINK_DIRECTORIES "${MYPACKAGE_LIBRARY_DIR}" ) target_link_libraries(MyPackage::MyPackage INTERFACE "${MYPACKAGE_LIBRARIES}") ``` 完成上述步骤后,你的包就可以被其他 CMake 文件 `find_package()` 调用了。例如,在其他项目中使用该包的方法如下: ```cmake find_package(MyPackage REQUIRED) # 使用 MyPackage 的头文件和库 target_include_directories(my_target PUBLIC ${MyPackage_INCLUDE_DIRS}) target_link_libraries(my_target PUBLIC MyPackage::MyPackage) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值