linux - 使用 -fPIC 重新编译 makefile

标签 linux cmake centos makefile

所以,我正在尝试在 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") 

最佳答案

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

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

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

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

关于linux - 使用 -fPIC 重新编译 makefile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32915853/

相关文章:

linux - 从另一个脚本运行 bash 脚本并在第二个脚本运行时退出第一个脚本

linux - 在 Linux 上以编程方式查看 Microsoft Office 文件

c++ - include_directories 和 CMAKE_INSTALL_FULL_INCLUDEDIR

使用错误的 API 模块编译的 PHP 警告 : PHP Startup: murmur: Unable to initialize module,

php - 在 CentOS 上使用 PHP 5.4 安装 APC(主干)

linux - httpd (pid 1766) 已经在运行,但我无法加载本地主机并在浏览器上看到 apache 确认

c - fork 和管道创建

linux - 如何创建仅具有某些扩展名但忽略服务器生成的具有类似扩展名的文件的 tar 文件?

opencv - 使用cmake和opencv构建 "hollow world"错误: undefined reference to viz's moduls

c++ - Cmake添加没有源文件的目录