无法使用find_package的PATHS选项指定本地安装的protobuf包
我是CMake新手,对其细节了解有限。此前我查阅了一篇相关帖子,尝试使用find_package的PATHS选项,指定项目使用build/third_party目录下本地安装的protobuf包,而非系统默认路径中的版本。
我在项目的CMakeLists.txt中添加了如下配置片段:
#a snippet of the CMakeLists.txt message("========================>FROM SERVERLESS<======================") cmake_minimum_required(VERSION 3.13) project(svgpu-manager C CXX) list(APPEND CMAKE_MODULE_PATH) set(protobuf_MODULE_COMPATIBLE TRUE) # find_package(Protobuf CONFIG REQUIRED) find_package(Protobuf CONFIG REQUIRED PATHS "${CMAKE_BINARY_DIR}/third_party/") #### line 11 # find_package(OpenCV 3.1 EXACT REQUIRED PATHS /usr/local/opencv3.1) message(STATUS "Using protobuf ${Protobuf_VERSION}") set(_PROTOBUF_LIBPROTOBUF protobuf::libprotobuf) set(_REFLECTION gRPC::grpc++_reflection) find_program(_PROTOBUF_PROTOC protoc PATHS "${CMAKE_BINARY_DIR}/third_party/") ###The CMakeLists.txt file continues...
但执行cmake命令时,得到如下输出:
... ... ========================>FROM SERVERLESS<====================== CMake Warning at /usr/local/lib/cmake/protobuf/protobuf-config.cmake:9 (find_package): Found package configuration file: /usr/local/lib/cmake/absl/abslConfig.cmake but it set absl_FOUND to FALSE so package "absl" is considered to be NOT FOUND. Reason given by package: The following imported targets are referenced, but are missing: protobuf::gmock Call Stack (most recent call first): worker/serverless_gpu/CMakeLists.txt:11 (find_package) -- Using protobuf 24.0.0 -- Using gRPC 1.59.0-dev ... ...
可以看到find_package忽略了PATHS参数,仍使用了系统默认路径的protobuf包,请问该如何解决此问题?
修正
PATHS路径指向:PATHS需要精准指向protobuf配置文件所在的目录,而非仅到third_party。本地安装的protobuf通常会在third_party/lib/cmake/protobuf或third_party/cmake下生成protobuf-config.cmake,补全路径后再尝试:find_package(Protobuf CONFIG REQUIRED PATHS "${CMAKE_BINARY_DIR}/third_party/lib/cmake/protobuf/")先检查
build/third_party下的目录结构,确认配置文件的实际位置。添加
NO_DEFAULT_PATH强制优先本地包:如果CMake仍优先加载系统包,在find_package中加入NO_DEFAULT_PATH参数,限制仅从指定路径查找:find_package(Protobuf CONFIG REQUIRED PATHS "${CMAKE_BINARY_DIR}/third_party/lib/cmake/protobuf/" NO_DEFAULT_PATH)注意:该参数会完全禁用默认路径查找,若本地protobuf依赖其他系统包,需额外处理依赖查找。
通过
CMAKE_PREFIX_PATH全局指定优先路径:在调用find_package前,将本地protobuf的根目录添加到CMAKE_PREFIX_PATH,CMake会优先从该路径下查找包配置:list(APPEND CMAKE_PREFIX_PATH "${CMAKE_BINARY_DIR}/third_party/") find_package(Protobuf CONFIG REQUIRED)这种方式更通用,适合多依赖包的场景。
确认本地protobuf的完整性:确保本地protobuf通过
cmake --install或类似方式正确安装到build/third_party,生成了完整的配置文件(如protobuf-config.cmake、protobuf-config-version.cmake)。若为预编译包,需确认配置文件存在。
内容的提问来源于stack exchange,提问作者Abhishek Ghosh

