Dan*_*ich 1 c++ cmake protocol-buffers
无法使用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})
Run Code Online (Sandbox Code Playgroud)
在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})
Run Code Online (Sandbox Code Playgroud)
但是我的IDE仍然输出类似
CMakeFiles / main.dir / main.cpp.o:在函数
main': /home/camille/ClionProjects/protobuf/main.cpp:42: undefined reference togoogle :: protobuf :: internal :: VerifyVersion(int,int,char const *)' /home/camille/ClionProjects/ protobuf /main.cpp: 49:未定义引用tutorial::AddressBook::AddressBook()' /home/camille/ClionProjects/protobuf/main.cpp:54: undefined reference togoogle :: protobuf :: Message :: ParseFromIstream(std :: istream *)'
我的错误在哪里?我该如何运作?
您的程序无法链接,因为${PROTOBUF_LIBRARY}在顶层范围内为空CMakeLists.txt。发生这种情况是因为调用add_subdirectory创建了一个子作用域,并且Protobuf_XXXby设置的变量find_package(Protobuf REQUIRED)仅在该子作用域中。
解决此问题的一种好方法是将以下内容添加到proto/CMakeLists.txt:
target_link_libraries(proto INTERFACE ${Protobuf_LIBRARIES})
Run Code Online (Sandbox Code Playgroud)
这指示链接到的目标proto也链接到${Protobuf_LIBRARIES}。现在,您可以简化target_link_libraries顶层CMakeLists.txt:
target_link_libraries(addressbook proto)
Run Code Online (Sandbox Code Playgroud)
附带一提,您还可以使用例如
target_link_libraries(${PROJECT_NAME} INTERFACE ... )
Run Code Online (Sandbox Code Playgroud)
${PROJECT_NAME}解析为您project(...)在该CMakeLists.txt文件的语句中设置的任何内容。
最后,请注意,此链接链接到Protobuf_LIBRARIES而不是PROTOBUF_LIBRARY。Protobuf_LIBRARIES包括协议缓冲区库和相关的Pthreads库。