You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 02:49:59