【问题标题】:makefile recompile with -fPIC使用 -fPIC 重新编译 makefile
【发布时间】:2015-10-02 21:05:05
【问题描述】:

所以,我正在尝试在 make 中构建一些东西。我通过 cmake 生成文件,转到构建文件的相应文件夹,然后:

make
Scanning dependencies of target Spenvis
[ 33%] Building CXX object source/CMakeFiles/Spenvis.dir/pySpenvisCSV.cc.o
[ 66%] Building CXX object source/CMakeFiles/Spenvis.dir/SpenvisCSV.cc.o
[100%] Building CXX object source/CMakeFiles/Spenvis.dir/SpenvisCSVCollection.cc.o
Linking CXX shared library libSpenvis.so
/usr/bin/ld: /usr/local/lib64/libpython2.7.a(abstract.o): relocation R_X86_64_32 against `.rodata.str1.8' can not be used when making a shared  object; recompile with -fPIC
/usr/local/lib64/libpython2.7.a: could not read symbols: Bad value
collect2: ld returned 1 exit status
make[2]: *** [source/libSpenvis.so] Error 1
make[1]: *** [source/CMakeFiles/Spenvis.dir/all] Error 2
make: *** [all] Error 2

就 make/cmake 而言,我还是个新手。我不确定从这里去哪里。我查看了几个建议,但我不确定哪些与我的特定问题相关,以及如何首先实施建议的修复。

停下来!

python_utilities 目录中有两个 CMakeLists.txt 文件。我将两者都包括在内。来自 spenvis_csv/source 的一个:

# Make sure the compiler can find include files
include_directories (${PYSPENVIS_SOURCE_DIR})

# get boost
set(Boost_USE_STATIC_LIBS   OFF)
#set(Boost_USE_MULTIEADED ON)
find_package(Boost COMPONENTS
            python
         REQUIRED)
include_directories(${Boost_INCLUDE_DIRS})
link_directories(${Boost_LIBRARY_DIRS})

# get python
include(FindPythonLibs)

set(PythonLibs_USE_STATIC_LIBS   OFF)
find_package(PythonLibs REQUIRED)
include_directories(${PYTHON_INCLUDE_DIRS})
link_directories(${PYTHON_LIBRARIES})


#
add_library(Spenvis  SHARED pySpenvisCSV.cc SpenvisCSV.cc SpenvisCSVCollection.cc)
TARGET_LINK_LIBRARIES(Spenvis ${Boost_LIBRARIES} ${PYTHON_LIBRARIES})

然后是第二个更短的:

cmake_minimum_required (VERSION 2.6)
set (Boost_NO_BOOST_CMAKE=ON)
project (PYSPENVIS)
add_subdirectory ("source") 

【问题讨论】:

  • 可以把Makefile的相关部分贴出来吗?

标签: linux cmake centos makefile


【解决方案1】:

您正在链接 static python 库,我相信它通常不会使用 -fPIC 构建,因此它的代码不会可重定位。另一方面,您的 Spenvis 目标是一个共享 库,将使用 -fPIC 构建,但在非 PIC 代码中的链接不会像这样工作。这就是链接器对你说的。

如果可能的话,你能否链接到 python 库的共享版本(即 libpython.so.2.7 或类似的东西,取决于你的系统如何命名它)?我本来希望 CMake 在默认情况下更喜欢链接到共享库,所以我想知道是否:

  • 您的系统上缺少共享的 libpython 库(不太可能,但可能)。
  • 您已经包含了一些 CMake 选项,这些选项告诉它更喜欢在静态库中进行链接。
  • 您已明确为 CMake 提供了静态 python 库,以便以某种方式链接。

如果您使用的是 FindPythonLibs CMake 模块,我希望它会在 PYTHON_LIBRARIES 变量中为您提供共享的 python 库,如果它在您的系统上可用的话。如果您更新您的问题以包含您的 CMakeLists.txt 文件,这可能有助于识别问题。

【讨论】:

  • 我添加了 CMakeLists.txt 文件以供参考,如果您想看一看。
  • 您还可以尝试几件事:(a) 使用 locate libpython 查看系统上安装了哪些 python 库,以及 (b) 使用 make VERBOSE=1 显示链接器行的完整输出。我还建议您不要将 PYTHON_LIBRARIES 传递给 link_directories(),因为它将包含实际的库,而不是目录。
  • 我应该通过什么命令将 python_libraries 传递给?抱歉,我对 make/cmake 不够精通,不知道自己在做什么。
  • 或许编辑 makefile 或 cmake 文件以直接指向库会更好?看着它,似乎唯一的 .so python 库是 python2.6,尽管它们在 usr/lib64 而不是 usr/local/lib64 中。我不相信该系统根本没有 2.7 库。我该如何编辑 cmake 文件来做到这一点?
猜你喜欢
  • 2013-08-25
  • 2016-09-12
  • 1970-01-01
  • 2012-11-28
  • 1970-01-01
  • 1970-01-01
  • 2015-01-18
相关资源
最近更新 更多