Forums : XPCom

Aller à la discussion :  Plus récente Plus ancienne

# [résolu] linker problèmes, composant gstreamer

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.

# Re: linker problèmes, composant gstreamer

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 ?

# Re: linker problèmes, composant gstreamer

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.