【问题标题】:How to solve 'undefined reference to'如何解决“未定义的引用”
【发布时间】:2017-06-27 14:55:43
【问题描述】:

我在 Ubuntu 16.04.1 上编译时遇到了一些此错误,

Linking CXX executable ../lib/Slicer-4.7/cli-modules/abcd
    /path/to/SimpleITK/SimpleITK-build/SimpleITK-build/lib/libSimpleITKBasicFilters1-0.11.so.1: undefined reference to `itk::ImageToImageFilter<itk::Image<int, 2u>, itk::Image<int, 2u> >::PushFrontInput(itk::DataObject const*)'

undefined reference to 是否意味着 SimpleITK 未链接? 以下是我的 Cmakelist:

cmake_minimum_required(VERSION 2.8.8)

#-----------------------------------------------------------------------------
set(MODULE_NAME "abcd")

#-----------------------------------------------------------------------------
set(MODULE_HOMEPAGE "${_EXT_HOMEPAGE}")
set(MODULE_CATEGORY "${_EXT_CATEGORY}")
set(MODULE_CONTRIBUTORS "abc")
set(MODULE_DESCRIPTION "abc" )
set(MODULE_ACKNOWLEDGEMENTS "${_EXT_ACKNOWLEDGEMENTS}")
set(MODULE_LICENSE_SHORT_DESCRIPTION "${MODULE_LICENSE_SHORT_DESCRIPTION}")
set(MODULE_MAJOR_VERSION "${_EXT_MAJOR_VERSION}")
set(MODULE_MINOR_VERSION "${_EXT_MINOR_VERSION}")
set(MODULE_PATCH_VERSION "${_EXT_PATCH_VERSION}")

# Configure XML description
configure_file(
  ${MODULE_NAME}.xml.in
  ${CMAKE_CURRENT_BINARY_DIR}/${MODULE_NAME}.xml
  @ONLY
  )

#-----------------------------------------------------------------------------
set(MODULE_INCLUDE_DIRECTORIES
  )

set(MODULE_SRCS
  )

set(MODULE_TARGET_LIBRARIES
  ${ITK_LIBRARIES} ${SimpleITK_LIBRARIES}
  )

#-----------------------------------------------------------------------------
SEMMacroBuildCLI(
  NAME ${MODULE_NAME}
  TARGET_LIBRARIES ${MODULE_TARGET_LIBRARIES}
  INCLUDE_DIRECTORIES ${MODULE_INCLUDE_DIRECTORIES}
  ADDITIONAL_SRCS ${MODULE_SRCS}
  )

#-----------------------------------------------------------------------------
if(BUILD_TESTING)
  add_subdirectory(Testing)
endif()

但如你所见,我确实有链接目标库 SimpleITK 和 ITK,该切片器模块在切片器 4.4 版本中工作正常,但在切片器更新到 4.7 后,它不起作用。 有谁知道如何解决这个问题,或者给我一些线索?任何帮助表示赞赏。

【问题讨论】:

    标签: cmake undefined-reference itk


    【解决方案1】:

    您的问题似乎与 SimpleITK 的内部不一致有关。也就是说,libSimpleITKBasicFilters1-0.11.so.1 的某些部分期望 PushFrontInput 在其他地方定义,而它可能应该从该库中导出(或至少在该库中定义)。

    编辑:Slicer 4.7 是当前的开发版本,因此不稳定。试试 4.6.2,这是最新的稳定版本。

    【讨论】:

      【解决方案2】:

      SimpleITK 中的内部依赖关系可能与 Slicer 使用的版本存在问题 变化:

      set(MODULE_TARGET_LIBRARIES
        ${ITK_LIBRARIES} ${SimpleITK_LIBRARIES}
        )
      

      到:

      set(MODULE_TARGET_LIBRARIES
        ${SimpleITK_LIBRARIES} ${SimpleITK_LIBRARIES} ${ITK_LIBRARIES} 
        )
      

      我相信 SimpleITK 中的以下补丁将解决该问题: https://github.com/SimpleITK/SimpleITK/commit/6fc22492ca1fd3ebb493160b7968c37a0a6f1986

      【讨论】:

      • 这似乎行不通,您还有其他想法吗?非常感谢
      • 要尝试的另一件事是关闭 SimpleITK 共享库:github.com/Slicer/Slicer/blob/master/SuperBuild/… 如果这不起作用,那么 "-DSITK_EXPLICIT_INSTANTIATION:BOOL=0" 将是最后一次尝试。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-20
      • 1970-01-01
      • 2018-01-17
      • 2013-02-14
      • 1970-01-01
      • 1970-01-01
      • 2020-12-11
      相关资源
      最近更新 更多