【发布时间】:2018-07-05 11:58:32
【问题描述】:
我正在尝试将代码编译为共享库(它在 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)
【问题讨论】:
-
你必须用
-fPIC编译itk;否则不能用它来构建.so;但听起来您图书馆的链接中缺少-lITKCommon? -
no -lITKCommon 存在于 LIBS 变量的 make 文件中。我使用 -fPIC 重新编译了 ITK,但仍然出现相同的错误
-
会不会是链接库的顺序有问题?
-
查看我的答案 - 问题出在链接库的顺序上,我有一个关于如何在这种情况下以最少的工作解决它的建议。
标签: c++ shared-libraries ubuntu-16.04 fpic