2015-10-02 3 views
0

Итак, я пытаюсь создать что-то в make. Я произвел файлы с помощью CMake, пошел в соответствующую папку для файла сборки, а также:makefile перекомпилировать с -fPIC

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 

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

Halp!

В каталоге python_utilities есть два файла CMakeLists.txt. Я включу оба. Один из spenvis_csv/источник:

# 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") 
+0

Можете ли вы разместить соответствующие разделы Makefile? –

ответ

0

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

Если возможно, можете ли вы установить ссылку на общую версию библиотеки python (то есть libpython.so.2.7 или что-то подобное, в зависимости от того, как ваша система называет ее)? Я ожидал бы CMake предпочитают ссылки на общую библиотеку по умолчанию, так что мне интересно, если либо:

  • У вас не хватает разделяемой libpython библиотеки в вашей системе (маловероятно, но возможно).
  • Вы включили некоторые опции CMake, которые говорят, что предпочитают связывание в статических библиотеках.
  • Вы явно предоставили CMake статическую библиотеку python для связи в некотором роде.

Если вы используете CMake модуль FindPythonLibs, я ожидал бы, что бы дать вам общую библиотеку питона в переменной PYTHON_LIBRARIES, если она доступна в вашей системе. Если вы обновите свой вопрос, включив в него файл CMakeLists.txt, это может помочь выявить проблему.

+0

Я добавил файл CMakeLists.txt для справки, если вы хотите взять gander. – QuantumCakes

+0

Еще несколько вещей, которые вы можете попробовать: (a) Посмотрите, какие библиотеки python установлены в вашей системе с 'locate libpython' и (b) Покажите полный вывод вашей линии компоновщика с' make VERBOSE = 1'. Я также предлагаю вам не пропускать PYTHON_LIBRARIES в 'link_directories()', поскольку он будет содержать фактические библиотеки, а не каталоги. –

+0

Через какую команду следует передавать python_libraries? Прошу прощения, я недостаточно разбираюсь в make/cmake, чтобы узнать, что я делаю. – QuantumCakes

Смежные вопросы