IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Autres éditeurs Discussion :

Chargement d'une lib partagée C++ dans un programme C


Sujet :

Autres éditeurs

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 92
    Points : 84
    Points
    84
    Par défaut Chargement d'une lib partagée C++ dans un programme C
    Salut,

    J'ai un programme écrit en C avec GTK+. J'utilise des bibliothèques partagées comme plugins pour ajouter des fonctionnalités au programme. Jusqu'à présent tous mes plugins étaient écrit en C et je n'avais pas de problème.
    Cependant, dernièrement, un utilisateur m'a envoyé un plugin écrit en C++ (avec le extern "C" {}). J'arrive à compiler le plugin sous Linux et Windows sans problème avec g++. Par contre je n'arrive à le charger seulement sous Windows. Sous Linux j'ai le message d'erreur suivant :
    undefined symbol : __out_of_range_FPCc__.

    Quelqu'un a-t-il déjà rencontré ce problème?? Qu'est ce que ce FPC?? Je mets ci dessous mon Makefile.win (pour Windows) et mon Makefile.am (pour Linux). Je pense que c'est un problème de compilation, et qu'il doit manquer une option de linkage sous Linux...

    Makefile.win
    CC = gcc.exe
    WINDRES = windres.exe
    RES =
    AVI_OBJ = avi.o
    DESCRIPT_ION_OBJ = descript_ion.o
    FILE_ID_DIZ_OBJ = file_id_diz.o
    HTML_OBJ = html.o
    MP3_OBJ = mp3.o
    OBJ = $(AVI_OBJ) $(DESCRIPT_ION_OBJ) $(FILE_ID_DIZ_OBJ) $(HTML_OBJ) $(MP3_OBJ) $(RES)
    LIBS = -L"C:\GTK4WIN\lib" -L"C:\GTK4WIN\extra\lib" -mno-cygwin -fnative-struct -mno-cygwin -fnative-struct -lmingwex -lgtk -lglib-2.0 -lgdk -lgmodule-2.0 --export-all-symbols --add-stdcall-alias -lmingwex -lcrtdll -lz -lws2_32 -lregex -lintl
    INCS = -I"D:\Dev-C++\include" -I"D:\Dev-C++\extra\include" -I"..\.."
    AVI_BIN = libgwplugindescriptionavi.dll
    DESCRIPT_ION_BIN = libgwplugindescriptiondescript_ion.dll
    FILE_ID_DIZ_BIN = libgwplugindescriptionfile_id_diz.dll
    HTML_BIN = libgwplugindescriptionhtml.dll
    MP3_BIN = libgwplugindescriptionmp3.dll
    BIN = $(AVI_BIN) $(DESCRIPT_ION_BIN) $(FILE_ID_DIZ_BIN) $(HTML_BIN) $(MP3_BIN)
    CFLAGS = $(INCS) -I"C:\GTK4WIN\include" -I"C:\GTK4WIN\extra\include" -I"C:\GTK4WIN\include\gtk" -fnative-struct -DHAVE_CONFIG_H -DOS_WIN32 -s -mwindows

    .PHONY: clean

    all: $(BIN)

    clean:
    rm -f $(OBJ) $(BIN)

    DLLWRAP=dllwrap.exe
    AVI_EXPFILE=liblibgwplugindescriptionavi.exp
    AVI_DEFFILE=liblibgwplugindescriptionavi.def
    AVI_STATICLIB=liblibgwplugindescriptionavi.a
    DESCRIPT_ION_EXPFILE=liblibgwplugindescriptiondescript_ion.exp
    DESCRIPT_ION_DEFFILE=liblibgwplugindescriptiondescript_ion.def
    DESCRIPT_ION_STATICLIB=liblibgwplugindescriptiondescript_ion.a
    FILE_ID_DIZ_EXPFILE=liblibgwplugindescriptionfile_id_diz.exp
    FILE_ID_DIZ_DEFFILE=liblibgwplugindescriptionfile_id_diz.def
    FILE_ID_DIZ_STATICLIB=liblibgwplugindescriptionfile_id_diz.a
    HTML_EXPFILE=liblibgwplugindescriptionhtml.exp
    HTML_DEFFILE=liblibgwplugindescriptionhtml.def
    HTML_STATICLIB=liblibgwplugindescriptionhtml.a
    MP3_EXPFILE=liblibgwplugindescriptionmp3.exp
    MP3_DEFFILE=liblibgwplugindescriptionmp3.def
    MP3_STATICLIB=liblibgwplugindescriptionmp3.a

    $(BIN): $(OBJ)
    $(DLLWRAP) --driver-name gcc --output-exp $(AVI_EXPFILE) --output-def $(AVI_DEFFILE) --implib $(AVI_STATICLIB) -o $(AVI_BIN) $(AVI_OBJ) ..\..\tools\libgwtools.a ..\..\data\libgwdata.a ..\..\res\libgwres.a $(LIBS) $(CFLAGS)
    $(DLLWRAP) --driver-name gcc --output-exp $(DESCRIPT_ION_EXPFILE) --output-def $(DESCRIPT_ION_DEFFILE) --implib $(DESCRIPT_ION_STATICLIB) -o $(DESCRIPT_ION_BIN) $(DESCRIPT_ION_OBJ) ..\..\tools\libgwtools.a ..\..\data\libgwdata.a ..\..\res\libgwres.a $(LIBS) $(CFLAGS)
    $(DLLWRAP) --driver-name gcc --output-exp $(FILE_ID_DIZ_EXPFILE) --output-def $(FILE_ID_DIZ_DEFFILE) --implib $(FILE_ID_DIZ_STATICLIB) -o $(FILE_ID_DIZ_BIN) $(FILE_ID_DIZ_OBJ) ..\..\tools\libgwtools.a ..\..\data\libgwdata.a ..\..\res\libgwres.a $(LIBS) $(CFLAGS)
    $(DLLWRAP) --driver-name gcc --output-exp $(HTML_EXPFILE) --output-def $(HTML_DEFFILE) --implib $(HTML_STATICLIB) -o $(HTML_BIN) $(HTML_OBJ) ..\..\tools\libgwtools.a ..\..\data\libgwdata.a ..\..\res\libgwres.a $(LIBS) $(CFLAGS)
    $(DLLWRAP) --driver-name gcc --output-exp $(MP3_EXPFILE) --output-def $(MP3_DEFFILE) --implib $(MP3_STATICLIB) -o $(MP3_BIN) $(MP3_OBJ) ..\..\tools\libgwtools.a ..\..\data\libgwdata.a ..\..\res\libgwres.a $(LIBS) $(CFLAGS)

    avi.o: avi.c
    $(CC) -c avi.c -o avi.o $(CFLAGS)

    descript_ion.o: descript_ion.c
    $(CC) -c descript_ion.c -o descript_ion.o $(CFLAGS)

    file_id_diz.o: file_id_diz.c
    $(CC) -c file_id_diz.c -o file_id_diz.o $(CFLAGS)

    html.o: html.c
    $(CC) -c html.c -o html.o $(CFLAGS)

    mp3.o: mp3.c
    $(CC) -c mp3.c -o mp3.o $(CFLAGS)
    Makefile.am
    libdir = $(exec_prefix)/share/${PACKAGE}/plugins/descr

    lib_LTLIBRARIES = libgwplugindescriptionavi.la \
    libgwplugindescriptiondescript_ion.la \
    libgwplugindescriptionfile_id_diz.la \
    libgwplugindescriptionhtml.la \
    libgwplugindescriptionmp3.la

    libgwplugindescriptionavi_la_LDFLAGS = 'glib-config --cflags gmodule' -fPIC -version-info 1:0:0
    libgwplugindescriptiondescript_ion_la_LDFLAGS = 'glib-config --cflags gmodule' -fPIC -version-info 1:0:0
    libgwplugindescriptionfile_id_diz_la_LDFLAGS = 'glib-config --cflags gmodule' -fPIC -version-info 1:0:0
    libgwplugindescriptionhtml_la_LDFLAGS = 'glib-config --cflags gmodule' -fPIC -version-info 1:0:0
    libgwplugindescriptionmp3_la_LDFLAGS = 'glib-config --cflags gmodule' -fPIC -version-info 1:0:0

    libgwplugindescriptionavi_la_SOURCES = avi.c
    libgwplugindescriptiondescript_ion_la_SOURCES = descript_ion.c
    libgwplugindescriptionfile_id_diz_la_SOURCES = file_id_diz.c
    libgwplugindescriptionhtml_la_SOURCES = html.c
    libgwplugindescriptionmp3_la_SOURCES = mp3.c

    INCLUDES = \
    -I$(top_srcdir)/intl \
    -I$(top_srcdir)/src \
    @GTK_CFLAGS@

    libgwplugindescriptionavi_la_IBADD = \
    @top_srcdir@/src/tools/libgwtools.a
    libgwplugindescriptiondescript_ion_la_IBADD = \
    @top_srcdir@/src/tools/libgwtools.a
    libgwplugindescriptionfile_id_diz_la_IBADD = \
    @top_srcdir@/src/tools/libgwtools.a
    libgwplugindescriptionhtml_la_IBADD = \
    @top_srcdir@/src/tools/libgwtools.a
    libgwplugindescriptionmp3_la_IBADD = \
    @top_srcdir@/src/tools/libgwtools.a
    Zero
    My site : http://blog.lecacheur.com
    GWhere project : http://www.gwhere.org
    Debian Addict site : http://www.debianaddict.org

  2. #2
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2002
    Messages : 290
    Points : 325
    Points
    325
    Par défaut
    J'ai eu un Pb similaire car ma shared lib n'était pas linkée par g++ mais par ld...

    des messages de ce type arrivent aussi quand on lie un exe gcc 2.xx avec une shared lib gcc3.x ou vis versa...

    Enfin verifie que ton exe est lié par g++ et non gcc...

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 92
    Points : 84
    Points
    84
    Par défaut
    Merci, en fait mon executable est généré par gcc alors que ma bibliothèque partagée est générée par g++. Je pense que le problème vient de là. J'ai vu que c'est possible de faire charger une bibliothèque partagée liée avec g++ par un programme lié avec gcc, cependant je n'ai pas trouvé de réelle explication. Du coup j'ai réécrit le plugin que l'on m'a envoyé en C. ;-)

    Encore merci pour ta réponse.
    Zero
    My site : http://blog.lecacheur.com
    GWhere project : http://www.gwhere.org
    Debian Addict site : http://www.debianaddict.org

  4. #4
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2002
    Messages : 290
    Points : 325
    Points
    325
    Par défaut
    Citation Envoyé par Zero
    Merci, en fait mon executable est généré par gcc alors que ma bibliothèque partagée est générée par g++. Je pense que le problème vient de là. J'ai vu que c'est possible de faire charger une bibliothèque partagée liée avec g++ par un programme lié avec gcc, cependant je n'ai pas trouvé de réelle explication. Du coup j'ai réécrit le plugin que l'on m'a envoyé en C. ;-)

    Encore merci pour ta réponse.
    IL me semble qu'il y a des conditions pour que sa marche...

    deja linker (la shared lib) avec l'option -Bsymbolic (-wl,-Bsymbolic) arrange les choses...

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 92
    Points : 84
    Points
    84
    Par défaut
    Ok merci, je vais tester ça.
    Zero
    My site : http://blog.lecacheur.com
    GWhere project : http://www.gwhere.org
    Debian Addict site : http://www.debianaddict.org

Discussions similaires

  1. Réponses: 0
    Dernier message: 05/12/2014, 17h42
  2. [Débutant] chargement d'une image SimpleButtonExport.Image dans resource
    Par denisdg dans le forum Windows Forms
    Réponses: 3
    Dernier message: 27/10/2012, 02h19
  3. utilisation d'une lib open source dans un projet C++
    Par essalhi momed dans le forum Visual C++
    Réponses: 0
    Dernier message: 03/03/2010, 11h45
  4. Ajout d'une lib ( Mylib.jar ) dans un projet.
    Par hapalemur dans le forum NetBeans
    Réponses: 1
    Dernier message: 13/10/2009, 17h58
  5. Réponses: 6
    Dernier message: 07/09/2007, 13h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo