gpt4 book ai didi

c++ - CMake 不适用于 Google Protobuf

转载 作者:行者123 更新时间:2023-11-30 00:45:53 29 4
gpt4 key购买 nike

无法使用 CMake 链接 protobuf 库。我的 CMakeLists 是

cmake_minimum_required(VERSION 3.6)
project(addressbook)

set(CMAKE_CXX_STANDARD 11)
set(PROJECT_NAME addressbook)

ADD_SUBDIRECTORY(proto)

INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})
ADD_EXECUTABLE(main main.cpp)
TARGET_LINK_LIBRARIES(main proto ${PROTOBUF_LIBRARY})

并且在 proto 子目录中还有另一个 CMakeLists.txt(这样它在 github repo https://github.com/shaochuan/cmake-protobuf-example 中完成)

INCLUDE(FindProtobuf)
FIND_PACKAGE(Protobuf REQUIRED)
INCLUDE_DIRECTORIES(${PROTOBUF_INCLUDE_DIR})
PROTOBUF_GENERATE_CPP(PROTO_SRC PROTO_HEADER message.proto)
ADD_LIBRARY(proto ${PROTO_HEADER} ${PROTO_SRC})

但是我的 IDE 仍然会输出类似这样的行

CMakeFiles/main.dir/main.cpp.o: In function main':
/home/camille/ClionProjects/protobuf/main.cpp:42: undefined reference
to
google::protobuf::internal::VerifyVersion(int, int, char const*)' /home/camille/ClionProjects/protobuf/main.cpp:49: undefined reference to tutorial::AddressBook::AddressBook()'
/home/camille/ClionProjects/protobuf/main.cpp:54: undefined reference
to
google::protobuf::Message::ParseFromIstream(std::istream*)'

我的错误在哪里?我如何让它发挥作用?

最佳答案

您的程序无法链接,因为 ${PROTOBUF_LIBRARY} 在您的顶级 CMakeLists.txt 范围内是空的。发生这种情况是因为调用 add_subdirectory 创建了一个子作用域,而 find_package(Protobuf REQUIRED) 设置的 Protobuf_XXX 变量仅在该子作用域中。

解决此问题的一个好方法是将以下内容添加到 proto/CMakeLists.txt:

target_link_libraries(proto INTERFACE ${Protobuf_LIBRARIES})

这指示链接到 proto 的目标也链接到 ${Protobuf_LIBRARIES}。现在您可以在顶级 CMakeLists.txt 中简化 target_link_libraries:

target_link_libraries(addressbook proto)

附带说明,您还可以使用例如

target_link_libraries(${PROJECT_NAME} INTERFACE ... )

${PROJECT_NAME} 解析为您在 CMakeLists.txt 文件的 project(...) 语句中设置的任何内容。

最后,请注意,此链接指向 Protobuf_LIBRARIES 而不是 PROTOBUF_LIBRARYProtobuf_LIBRARIES 包括 Protocol Buffers 库和依赖的 Pthreads 库。

关于c++ - CMake 不适用于 Google Protobuf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41043184/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com