提问人:Cassius0924 提问时间:4/24/2023 最后编辑:Cassius0924 更新时间:4/24/2023 访问量:283
Protobuf 库的 CMake 编译错误:未定义对“google::p rotobuf::Message::GetTypeName() const”的引用
CMake Compilation Error with Protobuf Library: undefined reference to `google::protobuf::Message::GetTypeName() const'
问:
我正在尝试使用同时利用 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}
答: 暂无答案
评论
/usr/local/lib/libOpen3D.so
-L/usr/bin/lib
-lprotobuf
${Open3D_LIBRARIES}
target_link_libraries