ubuntuusers.de

Makefile auf alternative statische library Version umleiten

Status: Ungelöst | Ubuntu-Version: Kubuntu 14.04 (Trusty Tahr)
Antworten |

ACorner

Anmeldungsdatum:
24. Februar 2019

Beiträge: 5

Hallo zusammen,

ich habe nicht sonderlich viel Erfahrung mit makefiles, insofern hoffe ich auf Geduld und Milde. Vor Jahren habe ich mir über die Paketquellen (trusty) ffmpeg auf dem Rechner installiert, die dann ja unter /opt landen. Nun wollte ich einen (fremden) source code kompilieren, der vom ffmeg abhängig ist. Selbiges schlägt schon mal fehl, weil die gleichen includes und libs auch von libavutil bereitgestellt werden, nur in einer zu alten Version. (Ich weiß, dass es eine neuere Version von Ubuntu gibt. Aber die Frage interessiert mich auch davon unabhängig). Ich habe schon viele Tage damit verbracht, herauszufinden, wie man gegen eine andere, statisch gelinkte Version (also in dem Fall die unter /opt/ffmpeg) kompiliert. Jetzt endlich habe ich eine Version gefunden, die so halbwegs funktioniert. Zumindest werden scheinbar die ffmpeg libraries genommen.

Das war der Originaleintrag:

1
2
_CFLAGS += $(shell pkg-config --cflags alsa libva libavcodec libswscale libswresample x11 x11-xcb xcb xcb-icccm xcb-screensaver xcb-dpms)
LIBS += -lrt $(shell pkg-config --libs alsa libva libavcodec libswscale libswresample x11 x11-xcb xcb xcb-icccm xcb-screensaver xcb-dpms)

und mit viel Bastelei habe ich das daraus gemacht:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
#_CFLAGS += -FPIC
LIBDIR = /opt/ffmpeg/lib
_CFLAGS += -I/opt/ffmpeg/include
_CFLAGS += $(shell pkg-config --cflags alsa libva x11 x11-xcb xcb xcb-icccm xcb-screensaver xcb-dpms)
LIBS += -lrt $(shell pkg-config --libs alsa libva x11 x11-xcb xcb xcb-icccm xcb-screensaver xcb-dpms)
_CFLAGS += -I/opt/ffmpeg/include/libswresample
_CFLAGS += -I/opt/ffmpeg/include/libavcodec
_CFLAGS += -I/opt/ffmpeg/include/libswscale

LIBS += -L/opt/ffmpeg/lib -lavcodec
LIBS += -L/opt/ffmpeg/lib -lswresample 
LIBS += -L/opt/ffmpeg/lib -lswscale    

Endlich meine Fragen: Wie könnte ich das z.B. mit pkg-config eleganter machen? Wie könnte ich sagen, dass die .pc Dateien in den Fällen aus dem ffmpeg Verzeichnis genommen werden sollen? In meinen Zeilen ist sicherlich einiges nicht notwendig, zu viel oder zu wenig. Bitte gerne den Rotstift ansetzen.

Als letzte Fehlermeldung erhalte ich

/usr/bin/ld: /opt/ffmpeg/lib/libavcodec.a(allcodecs.o): Die Umlagerung von 
/opt/ffmpeg/lib/libavcodec.a: error adding symbols: Ungültiger Wert
collect2: error: ld returned 1 exit status

Kann damit jemand was anfangen?

Vielen Dank im voraus

Alex

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11267

Wohnort: München

ACorner schrieb:

Endlich meine Fragen: Wie könnte ich das z.B. mit pkg-config eleganter machen? Wie könnte ich sagen, dass die .pc Dateien in den Fällen aus dem ffmpeg Verzeichnis genommen werden sollen?

Schau dir mal den Abschnitt "Environment" in der Manpage zu pkg-config an: https://manpages.ubuntu.com/manpages/bionic/man1/pkg-config.1.html#environment

     PKG_CONFIG_PATH
            List of directories where ‘.pc’ files are looked up.

ACorner

(Themenstarter)

Anmeldungsdatum:
24. Februar 2019

Beiträge: 5

Danke für deine Antwort. Mit PKG_CONFIG_PATH habe ich es schon erfolglos versucht, vielleicht habe ich es aber auch falsch eingebunden.

Auf der anderen Seite geht es aber hier nicht um zusätzliche Bibliotheken, sondern darum, dass welche mit gleichem Namen mehrfach vorhanden sind. Entweder durch offizielle Pakete oder wenn ich definitiv gegen eine andere statische Version kompilieren muss. So sind die ganzen libav* Bibliotheken einmal als einzelne Pakete installierbar oder aber in ffmpeg enthalten. Wenn ich nur die Suche über PKG_CONFIG_PATH erweitere, weiß der Kompiler/Linker doch immer noch nicht, welche Version genommen werden muss.

Oder übersehe ich da was?

ACorner

(Themenstarter)

Anmeldungsdatum:
24. Februar 2019

Beiträge: 5

Ich antworte mal selbst:

Ich habe es zwar nicht definitiv niedergeschrieben gefunden, aber es scheint so zu sein, dass der über PKG_CONFIG_PATH eingegebene Pfad Priorität hat. Wenn er also so gesetzt wird

1
export PKG_CONFIG_PATH=/opt/ffmpeg/lib/pkgconfig/

dann ergibt z.B.

1
pkg-config --libs libavutil libswscale

den gewollten Pfad:

1
-L/opt/ffmpeg/lib -lswscale -lavutil -lm 

ohne PKG_CONFIG_PATH:

1
-lavutil -lswscale  

Wieder einen Schritt weiter. Wenn jemand noch etwas zu der genannten Fehlermeldung einfällt, dann wäre ich wahrscheinlich schon fast am Ziel.

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11267

Wohnort: München

ACorner schrieb:

Wenn jemand noch etwas zu der genannten Fehlermeldung einfällt, dann wäre ich wahrscheinlich schon fast am Ziel.

Ruf make mal mit vorangestelltem LANG=C (damit bekommst du englische Fehlermeldungen, bei denen die Chancen besser stehen, dass man etwas dazu findet) auf und zeig die komplette Ausgabe des Befehls.

ACorner

(Themenstarter)

Anmeldungsdatum:
24. Februar 2019

Beiträge: 5

Etwas gesprächiger (wenn auch für mich nicht verständlicher)

1
2
3
4
g++ -g -O3 -Wall -Werror=overloaded-virtual -Wno-parentheses -fPIC -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -I/opt/ffmpeg/include -I/usr/include/alsa   -I/opt/libva-2.4.0/include -DPLUGIN_NAME_I18N='"vaapidevice"' -D_GNU_SOURCE -DAV_INFO -DAV_INFO_TIME=3000       -DGIT_REV='"a17c110"' -I/opt/vdr/vdr-2.4.0/include  -g -W -Wall -Wextra -Winit-self -Werror=overloaded-virtual -Wno-unused-parameter  -shared vaapidevice.o vaapidev.o video.o audio.o codec.o ringbuffer.o -lrt -pthread -L/opt/ffmpeg/lib -L/build/ffmpeg-dCX_YH/ffmpeg-3.4.0~trusty/build_libs/lib -lavcodec -lXv -lXext -lvdpau -lva-x11 -lva-drm -lva -lxcb-shm -lxcb-xfixes -lxcb-render -lxcb-shape -lasound -lSDL2 -lzimg -lxvidcore -lx265 -lx264 -lpthread -lwavpack -lvpx -lvorbisenc -lvorbis -lvidstab -ltheoraenc -ltheoradec -logg -lspeex -lpulse -lopus -lopencore-amrwb -lopencore-amrnb -lmp3lame -lfreetype -lfdk-aac -lass -lgnutls -lbz2 -lz -ldl -lswresample -lsoxr -lswscale -lavutil -lm -lX11-xcb -lX11 -lxcb-icccm -lxcb-screensaver -lxcb-dpms -lxcb   -L/opt/libva-2.4.0/lib -lva -o libvdr-vaapidevice.so
/usr/bin/ld: /opt/ffmpeg/lib/libavcodec.a(allcodecs.o): relocation R_X86_64_32 against `ff_h263_vaapi_hwaccel' can not be used when making a shared object; recompile with -fPIC
/opt/ffmpeg/lib/libavcodec.a: error adding symbols: Bad value
collect2: error: ld returned 1 exit status

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11267

Wohnort: München

ACorner schrieb:

1
/usr/bin/ld: /opt/ffmpeg/lib/libavcodec.a(allcodecs.o): relocation R_X86_64_32 against `ff_h263_vaapi_hwaccel' can not be used when making a shared object; recompile with -fPIC

Das ist ziemlich eindeutig - da wurde ffmpeg mit den falschen Optionen gebaut und du kannst nicht dagegen linken.

Du könntest du mal die ffmpeg 3.3 Pakete aus https://launchpad.net/~seahawk1986-hotmail/+archive/ubuntu/dvbt2/+packages?field.name_filter=ffmpeg3&field.status_filter=published&field.series_filter=trusty probieren, die müssten eigentlich aktuell genug für vaapidevice sein.

Oder du machst dir das Leben leichter und nimmst gleich ein aktuelleres (K)ubuntu 18.04, bei dem die mitgelieferte ffmpeg-Version aktuell genug für vaapidevice ist - Ubuntu 14.04 erreicht ja ohnehin bald das Ende seines Lebenszyklus.

ACorner

(Themenstarter)

Anmeldungsdatum:
24. Februar 2019

Beiträge: 5

1
Das ist ziemlich eindeutig - da wurde ffmpeg mit den falschen Optionen gebaut und du kannst nicht dagegen linken.

Okay, verstanden.

1
Du könntest du mal die ffmpeg 3.3 Pakete probieren, die müssten eigentlich aktuell genug für vaapidevice sein.

Danke für das Angebot. Da ich ja hier zufällig auf den Richtigen getroffen bin: mit dem ffmpeg Durcheinander habe ich mich eigentlich nur auseinander gesetzt, weil ich auf einem anderen Rechner softhddevice installieren wollte, das auch eine andere ffmpeg Version benötigt als die installierte. Nur auf diesem Gerät ist das Arbeiten leichter, deshalb der Umweg über vaapidevice. Da ich jetzt weiß, wie der Hase läuft, wird es schon irgendwie klappen.

1
Ubuntu 14.04 erreicht ja ohnehin bald das Ende seines Lebenszyklus.

Ja, ich habe schon ein paar Partitionen oder Geräte auf denen neuere Distributionen laufen, aber (nicht nur) mir geht KDE 5 reichlich auf den Senkel.

Nochmals Danke für deine Hilfe

Antworten |