cmake中的find_package(xxx REQUIRED)与set(CMAKE_PREFIX_PATH xxx)
cmake中的find_package(xxx REQUIRED)与set(CMAKE_PREFIX_PATH xxx)
目录
3 find_package(LibCompute) 和 find_package(LibCompute REQUIRED)的区别
4 查找FindLibCompute.cmake还是LibComputeConfig.cmake
1 find_package(xxx REQUIRED)
find_package(xxx REQUIRED)的作用就是寻找包,比如我们某个工程编译的时候需要用到opencv,那我们的CMakeList.txt中需要有find_package(OpenCV REQUIRED),他的原理简单来说就是去寻找OpenCVConfig.cmake文件,然后在OpenCVConfig.cmake文件中会指定opencv的库路径和头文件路径,从而你编译的时候也就找到了相应的头文件和库文件。
如果我们不加干预,那么find_package(OpenCV REQUIRED)会在默认路径中寻找OpenCVConfig.cmake,那么如果我们系统默认路径中的opencv版本不是我们想要的,我们自己在某个路径下cmake编译了更高版本的opencv,然后我们工程编译的时候想让cmake去寻找我们自己编译的更高版本的opencv的OpenCVConfig.cmake,那怎么办呢,这时候就要用set(CMAKE_PREFIX_PATH xxx)。
2 set(CMAKE_PREFIX_PATH xxx)
这个其实就是让cmake去我们指定的目录下寻找xxxxConfig.cmake,如果是opencv,那么我们把编译自己版本opencv时的install文件夹路径放到set(CMAKE_PREFIX_PATH /xxx/xxx/install)即可。这样cmake就会去找到我们自己的 ./install/lib/cmake/opencv4/OpenCVConfig.cmake。
3 find_package(LibCompute) 和 find_package(LibCompute REQUIRED)的区别
find_package(LibCompute) 和 find_package(LibCompute REQUIRED) 之间的主要区别在于:
- 没有指定REQUIRED:当你调用find_package(LibCompute)而不指定REQUIRED时,如果LibCompute库没有被找到,CMake会发出一个警告,但构建过程不会停止。这意味着即使找不到库,项目仍然可以继续构建,但是任何依赖于这个库的代码都不会被编译,因为相关的变量和目标可能不会被定义。
- 指定REQUIRED:当你调用find_package(LibCompute REQUIRED)时,你在告诉CMake这个库是项目构建所必需的。如果LibCompute库没有被找到,CMake会发出一个错误(FATAL_ERROR),并且构建过程会立即停止。这确保了只有当所有必需的依赖项都可用时,项目才能继续构建。
由于不指定REQUIRED并不会停止整个构建过程,一般来说find_package(LibCompute)会这样用
find_package(LibCompute)
if(NOT LibCompute_FOUND)
message(FATAL_ERROR "LibCompute not found!")
endif()
如果LibCompute库没有被找到,LibCompute_FOUND变量将不会被设置,因此if(NOT LibCompute_FOUND)条件为真。在这种情况下,message(FATAL_ERROR "LibCompute not found!")命令会被执行。这个命令会导致CMake在配置阶段报错,并以错误状态退出,从而停止整个构建过程。
4 查找FindLibCompute.cmake还是LibComputeConfig.cmake
在 CMake 中,find_package 命令用于查找外部库或软件包。当使用 find_package(LibCompute REQUIRED) 时,CMake 会在预定义的路径中查找与 LibCompute 相关的配置文件,这些文件通常有以下几种:
- Find Modules: CMake 会首先查找名为 FindLibCompute.cmake 的文件,这是一个 Find Module 文件,用于提供查找和设置库的逻辑。如果这个文件存在,CMake 会使用它来查找库。
- Config 文件: 如果没有找到 Find Module,CMake 会尝试查找名为 LibComputeConfig.cmake 的文件。这是一个 Config 文件,它通常由库的开发者提供,用于告诉 CMake 如何找到和使用库。这个文件通常包含库的位置、包含目录、库文件等信息。
- 包组件: 如果 LibCompute 支持组件查找,CMake 也可能查找类似 LibComputeComponents.cmake 的文件。
- 库的版本: 如果指定了版本,CMake 还会查找与版本号相关的文件,例如 LibCompute-1.0.0Config.cmake。
CMake 在查找这些文件时,会按照以下顺序搜索:
- CMake 的模块路径(CMAKE_MODULE_PATH 环境变量指定的路径)。
- 系统路径,如 /usr/local/lib/cmake、/usr/share/cmake 等。
- 项目中 CMakeLists.txt 文件所在的目录。
如果 find_package 命令找到了这些文件之一,它会使用文件中的逻辑来设置库的相关信息,如包含目录、库文件路径等。如果找不到这些文件,CMake 会报错并停止构建过程(如果使用了 REQUIRED 选项)。
一般我自己写就写FindLibCompute.cmake去找我自己放的一些第三方库,要是比如编译安装opencv,那么就是去找OpenCVConfig.cmake这种,这个不需要自己写,编译安装完opencv就会有OpenCVConfig.cmake。
5 FindLibCompute.cmake内容备份
# - Try to find Compute headers and libraries.
#
# Usage of this module as follows:
#
# find_package(LibCompute)
#
# Variables used by this module, they can change the default behaviour and need
# to be set before calling find_package:
#
# LibCompute_ROOT_DIR Set this variable to the root installation of
# LibCompute if the module has problems finding
# the proper installation path.
#
# Variables defined by this module:
#
# LibCompute_FOUND System has LibCompute libs/headers
# LibCompute_LIBRARIES The LibCompute libraries
# LibCompute_INCLUDE_DIRS The location of LibCompute headers
find_path(LibCompute_ROOT_DIR
NAMES include/export_funtions.h
PATHS ${CNSTREAM_ROOT_PATH}/3rdparty/jetson/compute
)
find_path(LibCompute_INCLUDE_DIRS
NAMES export_funtions.h
PATHS ${LibCompute_ROOT_DIR}/include
)
find_path(LibCompute_CUDA_INCLUDE_DIRS
NAMES cuda_runtime.h
PATHS ${LibCompute_ROOT_DIR}/include/cuda
)
set(LibCompute_LIBRARIES "")
set(COMPUTE_LIBS cudart trteng_exp cuda_utils)
foreach(lib ${COMPUTE_LIBS})
find_library(LibCompute_LIBRARIES_${lib}
NAMES ${lib}
PATHS ${LibCompute_ROOT_DIR}/lib/linux_lib
NO_DEFAULT_PATH
)
if(LibCompute_LIBRARIES_${lib})
list(APPEND LibCompute_LIBRARIES ${LibCompute_LIBRARIES_${lib}})
endif()
endforeach()
if (LibCompute_INCLUDE_DIRS)
list(APPEND LibCompute_INCLUDE_DIRS ${LibCompute_CUDA_INCLUDE_DIRS})
endif ()
if (LibCompute_LIBRARIES)
set(LibCompute_FOUND TRUE)
endif ()
更多推荐
所有评论(0)