c ++ разделяемая библиотека fPIC или неопределенная библиотека ubuntu 16.04 - PullRequest
0 голосов
/ 05 июля 2018

Я пытаюсь скомпилировать код как разделяемую библиотеку (он хорошо компилируется в Windows, но я не могу компилировать его в Ubuntu 16.04).

Если я пытаюсь скомпилировать «как на Windows», я получаю ошибку:

relocation R_X86_64_32 against `a local symbol' can not be used when making a shared object; recompile with -fPIC

чтобы компилировать статические библиотеки, которые связаны с моим кодом, я добавил опцию -fPIC (по-видимому, по умолчанию в windows, но не в linux, но я не уверен):

SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC")

и в моем коде, который скомпилирован с использованием qmake, я добавил:

QMAKE_CXXFLAGS += -fPIC

и теперь я получаю эти ошибки:

itkGDCMImageIO.cxx:(.text+0xf9e) : undefined reference to « typeinfo for itk::MetaDataObjectBase »
itkGDCMImageIO.cxx:(.text+0xfb5) : undefined reference to « itk::MetaDataObject<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::GetMetaDataObjectValue() const »

и т. Д. *

если я добавлю опцию -fPIC только для своего кода, а не для компиляции статических библиотек, которые он использует, я все равно получу ошибку:

relocation R_X86_64_32 against `a local symbol' can not be used when making a shared object; recompile with -fPIC

, даже если добавлен qmake_cxxflags -fPIC.

что я делаю не так? * (Я поставил здесь файл Make на случай, если это поможет: https://github.com/pdeman/mevislabFetalMRI/blob/master/Makefile.CHUVTools.Release)

1 Ответ

0 голосов
/ 06 июля 2018

С Makefile у меня есть шанс отладить проблему.

Ссылки LIBS в ITKCommon-4.13, так что это правильно; необходимо разрешить typeinfo for itk::MetaDataObjectBase; который запрашивается libITKIOGDCM-4.13.

строка LIBS содержит:

-lITKIOSiemens-4.13 -lITKBiasCorrection-4.13 -lITKIOSpatialObjects-4.13 -lITKBioCell-4.13 -lITKIOStimulate-4.13 -lITKCommon-4.13 -lITKIOTIFF-4.13 -lITKDICOMParser-4.13 -lITKIOTransformBase-4.13 -litkdouble-conversion-4.13 -lITKIOTransformHDF5-4.13 -lITKEXPAT-4.13 -lITKIOTransformInsightLegacy-4.13 -lITKFEM-4.13 -lITKIOTransformMatlab-4.13 -litkgdcmcharls-4.13 -lITKIOVTK-4.13 -litkgdcmCommon-4.13 -lITKIOXML-4.13 -litkgdcmDICT-4.13 -litkjpeg-4.13 -litkgdcmDSED-4.13 -lITKKLMRegionGrowing-4.13 -litkgdcmIOD-4.13 -lITKLabelMap-4.13 -litkgdcmjpeg12-4.13 -litklbfgs-4.13 -litkgdcmjpeg16-4.13 -lITKMesh-4.13 -litkgdcmjpeg8-4.13 -lITKMetaIO-4.13 -litkgdcmMEXD-4.13 -litkminc2-4.13 -litkgdcmMSFF-4.13 -litknetlib-4.13 -litkgdcmopenjp2-4.13 -litkNetlibSlatec-4.13 -litkgdcmsocketxx-4.13 -lITKniftiio-4.13 -litkgdcmuuid-4.13 -lITKNrrdIO-4.13 -lITKgiftiio-4.13 -lITKOptimizers-4.13 -litkgtest-4.13 -lITKOptimizersv4-4.13 -litkgtest_main-4.13 -lITKPath-4.13 -litkhdf5 -litkpng-4.13 -litkhdf5_cpp -lITKPolynomials-4.13 -lITKIOBioRad-4.13 -lITKQuadEdgeMesh-4.13 -lITKIOBMP-4.13 -lITKSpatialObjects-4.13 -lITKIOBruker-4.13 -lITKStatistics-4.13 -lITKIOCSV-4.13 -litksys-4.13 -lITKIOGDCM-4.13 -litktestlib-4.13 -lITKIOGE-4.13 -litktiff-4.13 -lITKIOGIPL-4.13 -lITKTransform-4.13 -lITKIOHDF5-4.13 -lITKTransformFactory-4.13 -lITKIOImageBase-4.13 -litkv3p_netlib-4.13 -lITKIOIPL-4.13 -litkvcl-4.13 -lITKIOJPEG-4.13 -lITKVideoCore-4.13 -lITKIOLSM-4.13 -lITKVideoIO-4.13 -lITKIOMesh-4.13 -litkvnl-4.13 -lITKIOMeta-4.13 -litkvnl_algo-4.13 -lITKIOMINC-4.13 -lITKVNLInstantiation-4.13 -lITKIOMRC-4.13 -lITKVTK-4.13 -lITKIONIFTI-4.13 -lITKWatersheds-4.13 -lITKIONRRD-4.13 -litkzlib-4.13 -lITKIOPNG-4.13 -lITKznz-4.13

Разрешение ссылки будет происходить по умолчанию слева направо, что означает, что, поскольку ссылка на ITKCommon-4.13 происходит до ссылки на ITKIOGDCM-4.13, typeinfo не разрешается.

Для этого есть два решения: первое - определить порядок зависимости ссылок всех библиотек и отсортировать их в обратном порядке. Я не знаю достаточно о зависимостях в библиотеках, чтобы даже приблизиться к предложению порядка, который мог бы работать, учитывая количество библиотек, на которые есть ссылки - здесь есть все признаки связывания кухонной раковины.

Второе решение - обернуть все параметры ссылки в флаг компоновщика, который говорит, что все эти файлы должны обрабатываться вместе для целей ссылки. Это, вероятно, замедлит соединение, но гарантирует, что выход из строя или перекрестные зависимости будут разрешены.

В начале списка -l элементов для библиотек ITK вы добавляете опцию: -

-Wl,--start-group

и в конце списка -l элементов для библиотек ITK вы добавляете опцию: -

--Wl,--end-group

Итак, для сокращения строки LIBS это будет выглядеть примерно так (многоточие указывает на отсутствующий текст):

-Wl,--start-group -lITKIOSiemens-4.13 … -lITKznz-4.13 -Wl,--end-group
...