Envoyé par : joliclic
Date : 14/02/2010 20:11
bonjour,
j'essaie de compiler un composant en C++, en fait une partie de XUL Music, et ceci dans le build system de mozilla. Une partie de la compilation fonctionne (les .o sont bien générés), mais çà coince au linkage, les "liens" à gstreamer ne sont visiblement trouvés.
Je vous montre mon Makefile.in :
DEPTH = ../../../../.. topsrcdir = @top_srcdir@ srcdir = @srcdir@ VPATH = @srcdir@ include $(DEPTH)/config/autoconf.mk MODULE = xmplayer LIBRARY_NAME = xmplayer IS_COMPONENT = 1 CPPSRCS = GstTrack.cpp GstPlayer.cpp GstModule.cpp DEFINES += `pkg-config --cflags gstreamer-0.10` REQUIRES = xpcom \ $(NULL) GSTREAMER_FLAGS=`pkg-config --cflags gstreamer-0.10 gstreamer-base-0.10` GSTREAMER_LIBS=`pkg-config --libs gstreamer-0.10 gstreamer-base-0.10` CXXFLAGS+= $(GSTREAMER_FLAGS) EXTRA_DSO_LDOPTS = \ $(GSTREAMER_LIBS) \ $(XPCOM_GLUE_LDOPTS) \ $(XPCOM_LIBS) \ $(NSPR_LIBS) \ $(NULL) include $(topsrcdir)/config/rules.mk
et le résultat
rm -f libxmplayer.so c++ -fno-rtti -fno-exceptions -Wall -Wpointer-arith -Woverloaded-virtual -Wsynth -Wno-ctor-dtor-privacy -Wno-non-virtual-dtor -Wcast-align -Wno-invalid-offsetof -Wno-long-long -pedantic -fno-strict-aliasing -fshort-wchar -pthread -pipe -DNDEBUG -DTRIMMED -Os -freorder-blocks -fno-reorder-functions -fPIC -shared -Wl,-z,defs -Wl,-h,libxmplayer.so -o libxmplayer.so GstTrack.o GstPlayer.o GstModule.o -lpthread -Wl,-rpath-link,/home/moi/dev/mozilla/fennec-objdir/xulrunner/dist/bin -Wl,-rpath-link,/usr/local/lib `pkg-config --libs gstreamer-0.10 gstreamer-base-0.10` /home/moi/dev/mozilla/fennec-objdir/xulrunner/dist/lib/libxpcomglue_s.a -L/home/moi/dev/mozilla/fennec-objdir/xulrunner/dist/bin -lxpcom -L/home/moi/dev/mozilla/fennec-objdir/xulrunner/dist/bin -lxpcom -lxul -L/home/moi/dev/mozilla/fennec-objdir/xulrunner/dist/lib -lplds4 -lplc4 -lnspr4 -lpthread -ldl -Wl,--version-script -Wl,/home/moi/dev/mozilla/mozilla-1-9-2/build/unix/gnu-ld-scripts/components-version-script -Wl,-Bsymbolic -lasound -ldl -lm GstTrack.o: In function `GstTrack::Pause()': GstTrack.cpp:(.text+0x1a4): undefined reference to `gst_element_set_state' GstTrack.o: In function `GstTrack::Stop()': GstTrack.cpp:(.text+0x1fb): undefined reference to `gst_element_set_state' GstTrack.cpp:(.text+0x200): undefined reference to `gst_object_get_type' GstTrack.cpp:(.text+0x213): undefined reference to `gst_object_unref' GstTrack.o: In function `GstTrack::initTrack(nsIFile*)': GstTrack.cpp:(.text+0x710): undefined reference to `gst_element_factory_make' GstTrack.o: In function `GstTrack::Play()': GstTrack.cpp:(.text+0x83b): undefined reference to `gst_element_set_state' GstTrack.o: In function `GstTrack::ProcessMediaTag(_GstStructure const*, char const*, GstTrack*)': GstTrack.cpp:(.text+0xa54): undefined reference to `gst_tag_list_get_value_index' GstTrack.o: In function `GstTrack::GetDuration(int*)': GstTrack.cpp:(.text+0xb75): undefined reference to `gst_element_query_duration' GstTrack.o: In function `GstTrack::GetPosition(int*)': GstTrack.cpp:(.text+0xbe0): undefined reference to `gst_element_query_position' GstTrack.o: In function `GstTrack::SetPosition(int)': GstTrack.cpp:(.text+0xc3d): undefined reference to `gst_element_query_duration' GstTrack.cpp:(.text+0xc67): undefined reference to `gst_element_seek_simple' GstTrack.o: In function `GstTrack::ParsedTags(_GstElement*, _GstElement*, _GstStructure*, GstTrack*)': GstTrack.cpp:(.text+0xa31): undefined reference to `gst_tag_list_foreach' GstPlayer.o: In function `GstPlayer::NewTrack(nsIURL*, xmITrack**)': GstPlayer.cpp:(.text+0x485): undefined reference to `gst_init' /usr/bin/ld: libxmplayer.so: hidden symbol `gst_object_unref' isn't defined /usr/bin/ld: final link failed: Nonrepresentable section on output collect2: ld a retourné 1 code d'état d'exécution make[9]: *** [libxmplayer.so] Erreur 1
Je suis sur une ubuntu 9.04, les fichiers de dev de gstreamer sont bien installés.
Quelqu'un à une idée ou un conseil pour me faire avancer ?
Je précise que je suis une buse en C++, j'y vais à taton.
Envoyé par : joliclic
Date : 16/02/2010 16:50
En rajoutant l'option -Wl,-t à la ligne de commande, j'obtiens des infos supplémentaires sur les fichiers utilisés par le linker, çà me semble correct:
c++ -fno-rtti -fno-exceptions -Wall -Wpointer-arith -Woverloaded-virtual -Wsynth -Wno-ctor-dtor-privacy -Wno-non-virtual-dtor -Wcast-align -Wno-invalid-offsetof -Wno-long-long -pedantic -fno-strict-aliasing -fshort-wchar -pthread -pipe -DNDEBUG -DTRIMMED -Os -freorder-blocks -fno-reorder-functions -fPIC -shared -Wl,-z,defs -Wl,-h,libxmplayer.so -o libxmplayer.so GstTrack.o GstPlayer.o GstModule.o -lpthread -Wl,-rpath-link,/home/moi/dev/mozilla/fennec-objdir/xulrunner/dist/bin -Wl,-rpath-link,/usr/local/lib `pkg-config --libs gstreamer-0.10 gstreamer-base-0.10` /home/moi/dev/mozilla/fennec-objdir/xulrunner/dist/lib/libxpcomglue_s.a -L/home/moi/dev/mozilla/fennec-objdir/xulrunner/dist/bin -lxpcom -L/home/moi/dev/mozilla/fennec-objdir/xulrunner/dist/bin -lxpcom -lxul -L/home/moi/dev/mozilla/fennec-objdir/xulrunner/dist/lib -lplds4 -lplc4 -lnspr4 -lpthread -ldl -Wl,--version-script -Wl,/home/moi/dev/mozilla/mozilla-1-9-2/build/unix/gnu-ld-scripts/components-version-script -Wl,-Bsymbolic -lasound -ldl -lm -Wl,-t
/usr/bin/ld: mode elf_i386 /usr/lib/gcc/i486-linux-gnu/4.3.3/../../../../lib/crti.o /usr/lib/gcc/i486-linux-gnu/4.3.3/crtbeginS.o GstTrack.o GstPlayer.o GstModule.o /lib/libpthread.so.0 -lgstbase-0.10 (/usr/lib/gcc/i486-linux-gnu/4.3.3/../../../../lib/libgstbase-0.10.so) -lgstreamer-0.10 (/usr/lib/gcc/i486-linux-gnu/4.3.3/../../../../lib/libgstreamer-0.10.so) -lgobject-2.0 (/usr/lib/gcc/i486-linux-gnu/4.3.3/../../../../lib/libgobject-2.0.so) -lgmodule-2.0 (/usr/lib/gcc/i486-linux-gnu/4.3.3/../../../../lib/libgmodule-2.0.so) -lgthread-2.0 (/usr/lib/gcc/i486-linux-gnu/4.3.3/../../../../lib/libgthread-2.0.so) -lrt (/usr/lib/gcc/i486-linux-gnu/4.3.3/../../../../lib/librt.so) -lxml2 (/usr/lib/gcc/i486-linux-gnu/4.3.3/../../../../lib/libxml2.so) -lglib-2.0 (/usr/lib/gcc/i486-linux-gnu/4.3.3/../../../../lib/libglib-2.0.so) (/home/moi/dev/mozilla/fennec-objdir/xulrunner/dist/lib/libxpcomglue_s.a)nsCOMPtr.o (/home/moi/dev/mozilla/fennec-objdir/xulrunner/dist/lib/libxpcomglue_s.a)nsComponentManagerUtils.o (/home/moi/dev/mozilla/fennec-objdir/xulrunner/dist/lib/libxpcomglue_s.a)nsMemory.o (/home/moi/dev/mozilla/fennec-objdir/xulrunner/dist/lib/libxpcomglue_s.a)nsGenericFactory.o (/home/moi/dev/mozilla/fennec-objdir/xulrunner/dist/lib/libxpcomglue_s.a)nsStringAPI.o (/home/moi/dev/mozilla/fennec-objdir/xulrunner/dist/lib/libxpcomglue_s.a)nsCRTGlue.o (/home/moi/dev/mozilla/fennec-objdir/xulrunner/dist/lib/libxpcomglue_s.a)nsISupportsImpl.o (/home/moi/dev/mozilla/fennec-objdir/xulrunner/dist/lib/libxpcomglue_s.a)nsTArray.o -lxpcom (/home/moi/dev/mozilla/fennec-objdir/xulrunner/dist/bin/libxpcom.so) -lxpcom (/home/moi/dev/mozilla/fennec-objdir/xulrunner/dist/bin/libxpcom.so) -lxul (/home/moi/dev/mozilla/fennec-objdir/xulrunner/dist/bin/libxul.so) -lplds4 (/home/moi/dev/mozilla/fennec-objdir/xulrunner/dist/bin/libplds4.so) -lplc4 (/home/moi/dev/mozilla/fennec-objdir/xulrunner/dist/bin/libplc4.so) -lnspr4 (/home/moi/dev/mozilla/fennec-objdir/xulrunner/dist/bin/libnspr4.so) /lib/libpthread.so.0 -ldl (/usr/lib/gcc/i486-linux-gnu/4.3.3/../../../../lib/libdl.so) -lasound (/usr/lib/gcc/i486-linux-gnu/4.3.3/../../../../lib/libasound.so) -ldl (/usr/lib/gcc/i486-linux-gnu/4.3.3/../../../../lib/libdl.so) -lstdc++ (/usr/lib/gcc/i486-linux-gnu/4.3.3/libstdc++.so) -lm (/usr/lib/gcc/i486-linux-gnu/4.3.3/../../../../lib/libm.so) -lgcc_s (/usr/lib/gcc/i486-linux-gnu/4.3.3/libgcc_s.so) /lib/libpthread.so.0 /lib/libc.so.6 (/usr/lib/libc_nonshared.a)stack_chk_fail_local.oS /lib/ld-linux.so.2 -lgcc_s (/usr/lib/gcc/i486-linux-gnu/4.3.3/libgcc_s.so) /usr/lib/gcc/i486-linux-gnu/4.3.3/crtendS.o /usr/lib/gcc/i486-linux-gnu/4.3.3/../../../../lib/crtn.o GstTrack.o: In function `GstTrack::Pause()': GstTrack.cpp:(.text+0x1a4): undefined reference to `gst_element_set_state' GstTrack.o: In function `GstTrack::Stop()': GstTrack.cpp:(.text+0x1fb): undefined reference to `gst_element_set_state' GstTrack.cpp:(.text+0x200): undefined reference to `gst_object_get_type' GstTrack.cpp:(.text+0x213): undefined reference to `gst_object_unref' GstTrack.o: In function `GstTrack::initTrack(nsIFile*)': GstTrack.cpp:(.text+0x710): undefined reference to `gst_element_factory_make' GstTrack.o: In function `GstTrack::Play()': GstTrack.cpp:(.text+0x83b): undefined reference to `gst_element_set_state' GstTrack.o: In function `GstTrack::ProcessMediaTag(_GstStructure const*, char const*, GstTrack*)': GstTrack.cpp:(.text+0xa54): undefined reference to `gst_tag_list_get_value_index' GstTrack.o: In function `GstTrack::GetDuration(int*)': GstTrack.cpp:(.text+0xb75): undefined reference to `gst_element_query_duration' GstTrack.o: In function `GstTrack::GetPosition(int*)': GstTrack.cpp:(.text+0xbe0): undefined reference to `gst_element_query_position' GstTrack.o: In function `GstTrack::SetPosition(int)': GstTrack.cpp:(.text+0xc3d): undefined reference to `gst_element_query_duration' GstTrack.cpp:(.text+0xc67): undefined reference to `gst_element_seek_simple' GstTrack.o: In function `GstTrack::ParsedTags(_GstElement*, _GstElement*, _GstStructure*, GstTrack*)': GstTrack.cpp:(.text+0xa31): undefined reference to `gst_tag_list_foreach' GstPlayer.o: In function `GstPlayer::NewTrack(nsIURL*, xmITrack**)': GstPlayer.cpp:(.text+0x485): undefined reference to `gst_init' /usr/bin/ld: libxmplayer.so: hidden symbol `gst_object_unref' isn't defined /usr/bin/ld: final link failed: Nonrepresentable section on output collect2: ld a retourné 1 code d'état d'exécution
Vraiment personne pour me donner un conseil ?
Envoyé par : joliclic
Date : 19/02/2010 11:38
J'ai finalement trouvé la solution :) .
La cause est expliquée ici: https://developer.mozilla.org/en/System_(..)
Une 1ere solution est donc de rajouter le nom du fichier entête utilisé à ceux listés dans le fichier 'mozilla/config/system-headers'.
exemple:
l'implémentation de mon composant utilisait
#include <gst/gst.h>
on rajoute
gst/gst.h
à la fin de mozilla/config/system-headers
Ce que se passe alors: Le système de compilation de Mozilla va alors créé le fichier objdir/xulrunner/config/system_wrappers/gst/gst.h et c'est celui-ci qui est utilisé lors de compilation des fichiers objets (.o), car le dossier system_wrappers est inclus en 1er.
pour info, le fichier créé par mozilla contient:
#pragma GCC system_header #pragma GCC visibility push(default) #include_next <gst/gst.h> #pragma GCC visibility pop
La compilation peut ensuite avoir lieu sans problèmes.
Je vais essayer de trouver une solution plus élégante, c'est à dire sans modifier un fichier des sources de mozilla, et je la posterai, mais pour l'instant je vais pouvoir continuer mon code :) .
Il n'est plus possible de poster des messages dans ce forum.
Copyright © 2003-2013 association xulfr, 2013-2016 Laurent Jouanneau - Informations légales.
Mozilla® est une marque déposée de la fondation Mozilla.
Mozilla.org™, Firefox™, Thunderbird™, Mozilla Suite™ et XUL™
sont des marques de la fondation Mozilla.