Я пытаюсь установить pymedia: http://pymedia.org/ на Ubuntu. Я в порядке с созданием самого pymedia из исходного кода, поскольку это кажется моим единственным вариантом, но я бы предпочел, чтобы исходные версии его предпосылок не лежали без дела, если бы я мог избежать этого.
Я установил большинство предварительных требований со следующим:
sudo apt-get install python-dev libogg-dev libvorbis-dev libfaad-dev libasound2-dev libmp3lame-dev
Затем я скачал tarball исходного кода pymedia и запустил:
python setup.py build
С этим я получаю:
OGG : found
VORBIS : found
FAAD : found
MP3LAME : found
VORBISENC : found
ALSA : found
Continue building pymedia ? [Y,n]:
Что выглядит хорошо. Я нажал «да», и это приводит к ошибкам:
#...
g++ -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions build/temp.linux-x86_64-2.6/sound/sound.o build/temp.linux-x86_64-2.6/sound/resample.o build/temp.linux-x86_64-2.6/sound/fft.o -logg -lvorbis -lfaad -lmp3lame -lvorbisenc -lasound -o build/lib.linux-x86_64-2.6/pymedia/audio/sound.so
/usr/bin/ld: build/temp.linux-x86_64-2.6/sound/sound.o: relocation R_X86_64_32 against `.rodata.str1.1' can not be used when making a shared object; recompile with -fPIC
build/temp.linux-x86_64-2.6/sound/sound.o: could not read symbols: Bad value
collect2: ld returned 1 exit status
error: command 'g++' failed with exit status 1
Что дает?
Эта ошибка не связана с предварительными требованиями, скорее всего, это плохой сценарий сборки.
Если я правильно понимаю (мой C-foo слаб), 64-битные разделяемые библиотеки должны быть скомпилированы с флагом -fPIC, а sound.cpp в этом случае нет.
В файле setup.py pymedia есть функция с именем * disable_fPIC *, которая заставляет gcc компилировать все свои библиотеки без него. Вы можете попытаться отключить эту функцию (просто замените весь код оператором pass) и попробуйте скомпилировать ее снова. Он должен прочитать что-то вроде этого:
def disable_fPIC():
pass
Я не могу проверить это, поскольку моя машина 32-битная, поэтому я могу только надеяться, что это поможет.