如何解决'undefined reference to'
How to solve 'undefined reference to'
我在 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 不是 linked?
以下是我的 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()
但是如你所见,我有 link 个目标库
SimpleITK 和 ITK,以及那个切片器模块在切片器 4.4 版本中工作正常,但在切片器更新到 4.7 后,它不起作用。
有谁知道如何解决这个问题,或者给我一些线索?任何帮助表示赞赏。
您的问题似乎与 SimpleITK 的内部不一致有关。即,libSimpleITKBasicFilters1-0.11.so.1 的某些部分期望 PushFrontInput 在其他地方定义,而它可能应该从该库中导出(或至少在该库中定义)。
编辑:Slicer 4.7 是当前的开发版本,因此不稳定。尝试 4.6.2,这是最新的稳定版本。
SimpleITK 中的 intra-dependencies 可能有问题,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
我在 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 不是 linked?
以下是我的 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()
但是如你所见,我有 link 个目标库 SimpleITK 和 ITK,以及那个切片器模块在切片器 4.4 版本中工作正常,但在切片器更新到 4.7 后,它不起作用。 有谁知道如何解决这个问题,或者给我一些线索?任何帮助表示赞赏。
您的问题似乎与 SimpleITK 的内部不一致有关。即,libSimpleITKBasicFilters1-0.11.so.1 的某些部分期望 PushFrontInput 在其他地方定义,而它可能应该从该库中导出(或至少在该库中定义)。
编辑:Slicer 4.7 是当前的开发版本,因此不稳定。尝试 4.6.2,这是最新的稳定版本。
SimpleITK 中的 intra-dependencies 可能有问题,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