CentOS7.9下GCC11.2编译VTK8.1.2出现undefined reference错误求助
GCC11.2编译VTK8.1.2后Demo出现undefined reference问题
环境信息
- 系统:CentOS7.9-2009
- VTK版本:8.1.2
- 强制使用编译器:GCC11.2(无法退回系统默认GCC4.8.5)
Demo代码
#include <vtkSmartPointer.h> #include <vtkRenderer.h> #include <vtkRenderWindow.h> #include <vtkRenderWindowInteractor.h> #include <vtkSphereSource.h> #include <vtkPolyDataMapper.h> #include <vtkActor.h> int main() { auto sphereSource = vtkSmartPointer<vtkSphereSource>::New(); sphereSource->SetRadius(5.0); auto mapper = vtkSmartPointer<vtkPolyDataMapper>::New(); mapper->SetInputConnection(sphereSource->GetOutputPort()); auto actor = vtkSmartPointer<vtkActor>::New(); actor->SetMapper(mapper); auto renderer = vtkSmartPointer<vtkRenderer>::New(); renderer->AddActor(actor); renderer->SetBackground(0.1, 0.2, 0.4); auto renderWindow = vtkSmartPointer<vtkRenderWindow>::New(); renderWindow->AddRenderer(renderer); auto interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New(); interactor->SetRenderWindow(renderWindow); renderWindow->Render(); interactor->Start(); return 0; }
CMakeLists.txt
cmake_minimum_required(VERSION 3.22) project(test) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -gdwarf-4") find_package(VTK REQUIRED PATHS) add_executable(test main.cpp) target_link_libraries(test PRIVATE ${VTK_LIBRARIES}) target_include_directories(test PRIVATE ${VTK_INCLUDE_DIRS})
编译情况
- 用系统默认GCC4.8.5编译VTK后,Demo可正常编译运行,VTK编译命令:
cmake .. -DCMAKE_BUILD_TYPE=Release - 用GCC11.2编译VTK后,构建Demo时出现大量
undefined reference错误,VTK编译命令:cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER=/usr/local/gcc11.2/bin/gcc -DCMAKE_CXX_COMPILER=/usr/local/gcc11.2/bin/g++ - 已确认编译Demo使用的GCC版本与编译VTK的GCC11.2完全一致。
错误信息示例
CMakeFiles/test.dir/main.cpp.o:main.cpp:(.text.unlikely+0x38): more undefined references to `vtkSmartPointerBase::~vtkSmartPointerBase()' follow /home/Code/VTK/VTK-8.1.2/installation/include/vtk-8.1/vtkSmartPointer.h:155: undefined reference to `vtkSphereSource::New()' /home/Code/VTK/VTK-8.1.2/installation/include/vtk-8.1/vtkSmartPointer.h:207: undefined reference to `vtkSmartPointerBase::vtkSmartPointerBase(vtkObjectBase*, vtkSmartPointerBase::NoReference const&)' /home/Code/VTK/VTK-8.1.2/installation/include/vtk-8.1/vtkSmartPointer.h:155: undefined reference to `vtkPolyDataMapper::New()' /home/Code/VTK/VTK-8.1.2/installation/include/vtk-8.1/vtkSmartPointer.h:207: undefined reference to `vtkSmartPointerBase::vtkSmartPointerBase(vtkObjectBase*, vtkSmartPointerBase::NoReference const&)' /home/Code/VTK/VTK-8.1.2/installation/include/vtk-8.1/vtkAlgorithm.h:455: undefined reference to `vtkAlgorithm::GetOutputPort(int)' /home/Code/VTK/VTK-8.1.2/installation/include/vtk-8.1/vtkSmartPointer.h:155: undefined reference to `vtkActor::New()'
解决方案
1. 统一C++ ABI设置
GCC5+默认启用新C++ ABI(_GLIBCXX_USE_CXX11_ABI=1),而GCC4.8.5用旧ABI,两者编译的库不兼容。需在VTK和Demo编译时统一ABI:
- 编译VTK时添加ABI参数:
cmake .. -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_C_COMPILER=/usr/local/gcc11.2/bin/gcc \ -DCMAKE_CXX_COMPILER=/usr/local/gcc11.2/bin/g++ \ -DCMAKE_CXX_FLAGS="-D_GLIBCXX_USE_CXX11_ABI=1" - 修改Demo的CMakeLists添加相同定义:
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -gdwarf-4 -D_GLIBCXX_USE_CXX11_ABI=1")
2. 清除缓存重新编译VTK
删除VTK原有build目录,避免旧编译缓存干扰:
rm -rf build && mkdir build && cd build # 执行上述带ABI参数的cmake命令 make -j$(nproc) && make install
3. 明确VTK查找路径
修改Demo的CMakeLists,指定GCC11.2编译的VTK安装路径,防止找到系统旧库:
find_package(VTK REQUIRED PATHS "/home/Code/VTK/VTK-8.1.2/installation")
4. 调整C++标准版本
VTK8.1.2对C17支持有限,建议将Demo的C标准改为C++14:
set(CMAKE_CXX_STANDARD 14)
5. 验证链接路径
运行make VERBOSE=1查看Demo的链接命令,确认链接的是GCC11.2编译的VTK库。若链接旧库,先设置环境变量:
export LD_LIBRARY_PATH=/home/Code/VTK/VTK-8.1.2/installation/lib:$LD_LIBRARY_PATH
再重新编译Demo。
内容的提问来源于stack exchange,提问作者35p
相关产品推荐
相关产品推荐

