Cmake find_package(Protobuf REQUIRED)不能按我的要求工作

cld4siwp  于 2023-03-30  发布在  其他
关注(0)|答案(1)|浏览(195)

我的目标是配置cmake文件并使用protobuf lib构建我的应用程序。
我尝试的步骤:
1.在Ubuntu 20.04中构建的protobuf遵循了protobuf github repo C++ Protobuf - Unix中的这一部分指令,包括将protoc复制到/usr/local/bin
1.配置我的CMakeList.txt如下:

include(FindProtobuf)
find_package(Protobuf REQUIRED)
message("${Protobuf_LIBRARIES}")
message("${Protobuf_INCLUDE_DIRS}")
include_directories(${Protobuf_INCLUDE_DIRS})
include_directories(${CMAKE_CURRENT_BINARY_DIR})
protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS XXX.proto XXX.proto)
message("${PROTO_SRCS}")
message("${PROTO_HDRS}")
add_library(proto_msg_lib ${PROTO_SRCS} ${PROTO_HDRS})
target_link_libraries(proto_msg_lib INTERFACE ${Protobuf_LIBRARIES})

当我运行cmake的时候,除了一长串的错误列表表明它找不到一堆与内部protobuf lib相关的“包含文件”之外。我还看到了这个警告,这让我很烦恼:

Protobuf compiler version 21.12 doesn't match library version

Protobuf_LIBRARIES和Protobuf_INCLUDE_DIRS的打印输出为

/usr/lib/x86_64-linux-gnu/libprotobuf.so;-lpthread
/usr/include

我的问题是:
1.为什么find_package(Protobuf REQUIRED)会在这个路径/usr/lib/x86_64-linux-gnu/libprotobuf.so中查找protobuf lib?
1.我怎样才能找到libprotobuf.so我构建的protobuf的正确版本(v21.12)的www.example.com?
1.我是否需要包含protobuf的所有源文件头,或者我可以只包含libprotobuf.so(或类似的东西)?

jxct1oxe

jxct1oxe1#

您是否尝试使用Protobuf_ROOT来指定您的本地protobuf安装?
参考:https://cmake.org/cmake/help/latest/variable/PackageName_ROOT.html
注意:另一种方法是直接在构建中使用FetchContent() protobuf

message(CHECK_START "Fetching Protobuf")
list(APPEND CMAKE_MESSAGE_INDENT "  ")
set(protobuf_BUILD_TESTS OFF)
set(protobuf_BUILD_SHARED_LIBS OFF)
set(protobuf_BUILD_EXPORT OFF)
set(protobuf_MSVC_STATIC_RUNTIME OFF)
FetchContent_Declare(
  protobuf
  GIT_REPOSITORY "https://github.com/protocolbuffers/protobuf.git"
  GIT_TAG "v21.12"
  GIT_SUBMODULES ""
  #PATCH_COMMAND git apply --ignore-whitespace ".../protobuf-v21.12.patch"
)
FetchContent_MakeAvailable(protobuf)
list(POP_BACK CMAKE_MESSAGE_INDENT)
message(CHECK_PASS "fetched")

注:自3.24起,您还可以使用OVERRIDE_FIND_PACKAGE
参考:https://cmake.org/cmake/help/latest/module/FetchContent.html#command:fetchcontent_declare

相关问题