Protobuf 库的 CMake 编译错误:未定义对“google::p rotobuf::Message::GetTypeName() const”的引用

CMake Compilation Error with Protobuf Library: undefined reference to `google::protobuf::Message::GetTypeName() const'

提问人:Cassius0924 提问时间:4/24/2023 最后编辑:Cassius0924 更新时间:4/24/2023 访问量:283

问:

我正在尝试使用同时利用 Protobuf 和 Open3D 库的 CMake 编译一个项目。但是,在编译过程中,我遇到了以下错误:

➜  build git:(dev) ✗ ninja -v

[1/1] : && /usr/bin/g++ -std=c++17  CMakeFiles/protoTest.dir/src/protoTest.cpp.o CMakeFiles/protoTest.dir/src/polygon.pb.cc.o -o protoTest  -Wl,-rpath,/usr/local/lib  /usr/local/lib/libprotobuf.so  -lpthread  /usr/local/lib/libOpen3D.so && :
FAILED: protoTest
: && /usr/bin/g++ -std=c++17  CMakeFiles/protoTest.dir/src/protoTest.cpp.o CMakeFiles/protoTest.dir/src/polygon.pb.cc.o -o protoTest  -Wl,-rpath,/usr/local/lib  /usr/local/lib/libprotobuf.so  -lpthread  /usr/local/lib/libOpen3D.so && :
CMakeFiles/protoTest.dir/src/polygon.pb.cc.o:(.data.rel.ro._ZTV2pg[_ZTV2pg]+0x20): undefined reference to `google::protobuf::Message::GetTypeName() const'
CMakeFiles/protoTest.dir/src/polygon.pb.cc.o:(.data.rel.ro._ZTV2pg[_ZTV2pg]+0x40): undefined reference to `google::protobuf::Message::InitializationErrorString() const'
collect2: error: ld returned 1 exit status
ninja: build stopped: subcommand failed.

这是忍者失败的 CMakeList.txt:

cmake_minimum_required(VERSION 3.10)

SET(CMAKE_CXX_STANDARD 17)
SET(CMAKE_CXX_STANDARD_REQUIRED TRUE)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17")


SET(this_target protoTest)

find_package(Open3D REQUIRED)
include_directories("/usr/local/include/open3d")

find_package(Protobuf REQUIRED)
link_directories(${Protobuf_LIBRARY_DIRS})

add_executable(protoTest
        src/protoTest.cpp
        src/polygon.pb.cc
        src/polygon.pb.h
        )

target_link_libraries(protoTest 
        ${Protobuf_LIBRARIES}
        ${Open3D_LIBRARIES}
        )

但是,当我没有将可执行文件链接到 时,错误消失了,项目编译成功:${Open3D_LIBRARIES}

[1/3] /usr/bin/g++   -std=c++17 -std=gnu++1z -MD -MT CMakeFiles/protoTest.dir/src/protoTest.cpp.o -MF CMakeFiles/protoTest.dir/src/protoTest.cpp.o.d -o CMakeFiles/protoTest.dir/src/protoTest.cpp.o -c /home/ncistwlwgczx/Acquiring/src/protoTest.cpp
[2/3] /usr/bin/g++   -std=c++17 -std=gnu++1z -MD -MT CMakeFiles/protoTest.dir/src/polygon.pb.cc.o -MF CMakeFiles/protoTest.dir/src/polygon.pb.cc.o.d -o CMakeFiles/protoTest.dir/src/polygon.pb.cc.o -c /home/ncistwlwgczx/Acquiring/src/polygon.pb.cc
[3/3] : && /usr/bin/g++ -std=c++17  CMakeFiles/protoTest.dir/src/protoTest.cpp.o CMakeFiles/protoTest.dir/src/polygon.pb.cc.o -o protoTest  -Wl,-rpath,/usr/local/lib  /usr/local/lib/libprotobuf.so  -lpthread && :

这是 CMakeList.txt 为忍者成功:

cmake_minimum_required(VERSION 3.10)

SET(CMAKE_CXX_STANDARD 17)
SET(CMAKE_CXX_STANDARD_REQUIRED TRUE)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17")


SET(this_target protoTest)

# find_package(Open3D REQUIRED)
# include_directories("/usr/local/include/open3d")

find_package(Protobuf REQUIRED)
link_directories(${Protobuf_LIBRARY_DIRS})

add_executable(protoTest
        src/protoTest.cpp
        src/polygon.pb.cc
        src/polygon.pb.h
        )

target_link_libraries(protoTest 
        ${Protobuf_LIBRARIES}
        # ${Open3D_LIBRARIES}
        )

我试过改变 和 的顺序。 我尝试重新安装 Protobuf 库并将其添加到我的 CMakeLists.txt 文件中。我希望代码能够成功编译并运行而不会出现任何错误。${Protobuf_LIBRARIES}${Open3D_LIBRARIES}

cmake 编译器错误 协议缓冲区 未定义引用 open3d

评论

0赞 starball 4/24/2023
奇怪的是,您的编译命令中有一个独立的命令 - 尤其是当它已经有 和 .您能向我们展示从调用中删除后编译命令的样子吗?/usr/local/lib/libOpen3D.so-L/usr/bin/lib-lprotobuf${Open3D_LIBRARIES}target_link_libraries
0赞 Cassius0924 4/24/2023
好吧,这是我的错误。我已经编辑了我的问题。我提供的信息是否足够?@user

答: 暂无答案