- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
无法使用 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':
google::protobuf::internal::VerifyVersion(int, int, char const*)' /home/camille/ClionProjects/protobuf/main.cpp:49: undefined reference to
/home/camille/ClionProjects/protobuf/main.cpp:42: undefined reference
totutorial::AddressBook::AddressBook()'
google::protobuf::Message::ParseFromIstream(std::istream*)'
/home/camille/ClionProjects/protobuf/main.cpp:54: undefined reference
to
我的错误在哪里?我如何让它发挥作用?
最佳答案
您的程序无法链接,因为 ${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_LIBRARY
。 Protobuf_LIBRARIES
包括 Protocol Buffers 库和依赖的 Pthreads 库。
关于c++ - CMake 不适用于 Google Protobuf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41043184/
我是一名优秀的程序员,十分优秀!