2012-12-14 3 views
2

Je SOLVED CE NUMÉRO PAR MOI-MÊMEC++ Wrapper pour la bibliothèque C comme bibliothèque partagée

Le problème est le lien de la bibliothèque. J'ai copié le libmywrapper.so (i rebaptisèrent) fichier dans/usr/lib et lié à -mywrapper Que c'est :-)

Original post:

J'écris une bibliothèque wrapper qui permet d'appeler des fonctions C++ à partir de C-code. Unfortnuately il ne lie pas ...

wrapper.h:

#ifdef __cplusplus 
extern "C" 
{ 
#endif 
    extern char* (keygen)(); 
#ifdef __cplusplus 
} 
#endif 

wrapper.cpp:

#include "wrapper.h" 
#include <someincludes> 
char* keygen() 
{ 
    urandom u; 

Makefile:

TARGET  := ./mywrapperlib.so 
CXXFLAGS := -fPIC -shared -g -Wall -std=c++0x -I../someincludes -I. 
CXX   := g++ 
LIB   := -lsomelibs 
EXT   := cpp 
BUILDDIR := build 

override BUILDDIR := $(strip $(BUILDDIR)) 
SOURCES := $(wildcard *.$(EXT)) 
OBJECTS := $(patsubst %.$(EXT), $(BUILDDIR)/%.o, $(SOURCES)) 
DEPS  := $(patsubst %.$(EXT), $(BUILDDIR)/%.dep, $(SOURCES)) 

.PHONY: all 
all: $(TARGET) 

$(TARGET): $(OBJECTS) $(DEPS) 
    $(CXX) $(CXXFLAGS) -o $(TARGET) $(OBJECTS) $(LIBS) 

ifneq ($(MAKECMDGOALS), clean) 
-include $(DEPS) 
endif 

$(OBJECTS): $(BUILDDIR)/%.o: %.$(EXT) $(BUILDDIR)/%.dep $(BUILDDIR)/.tag 
    $(CXX) $(CXXFLAGS) -c $< -o [email protected] 

$(DEPS): $(BUILDDIR)/%.dep: %.$(EXT) $(BUILDDIR)/.tag 
    mkdir -p $(dir $(@)) 
    $(CXX) $(CXXFLAGS) -MM $< -MT [email protected] -MT $(<:.$(EXT)=.o) -o [email protected] 

%.tag: 
    mkdir -p $(dir $(@)) 
    touch [email protected] 

.PHONY: clean 
clean: 
    $(RM) -r $(BUILDDIR) 

Un fichier de test qui devrait utiliser la bibliothèque: test.c:

#include <wrapper.h> 
int main() 
{ 
    char* test = keygen(); 
} 

Lorsque je tente de le compiler avec

gcc -o test.a -g -Iinclude -Llib/mywrapperlib.so test.c 

Je reçois

/tmp/ccB9bEot.o: In function `main': 
/some/paths/test.c:7: undefined reference to `keygen' 

Im très inexpérimentée avec le mélange C++ C & code et l'écriture des bibliothèques. Maintenant im coincé et j'espère que quelqu'un peut m'aider avec ce problème.

EDIT:

J'ai vérifié le répertoire lib avec nm:

nm lib/cryptdbwrapperlib.so | grep keygen 
0000000000006935 T keygen 

Donc, je suppose que le problème est le lien ...

+2

Le titre de la question avait-il un sens lorsque vous l'avez écrit? ;) – jalf

+0

C'est * bibliothèques * –

+0

Yo, dawg ....... –

Répondre

1

Il est à voir avec l'ordre de vos drapeaux à gcc.

Faites ceci:

gcc -o test.a -g -Iinclude test.c -Llib/mywrapperlib.so 
#       ^^^^^^ ^^^^^^^^^^^^^^^^^^^^^ 
#       first second 

GCC lit les bibliothèques et les objets de gauche à droite et (essentiellement) ignore celles qui ne sont pas nécessaires « encore ». Avec mon changement proposé, test.c va en premier donc GCC sait qu'il va chercher un symbole keygen; puis, quand il voit enfin -Llib/mywrapperlib.so il l'analyse pour keygen, le trouve, et sait que cette bibliothèque est nécessaire.

+0

Malheureusement, cela ne l'a pas résolu. – user1904027

+1

Notez le vrai problème, cette ligne n'est pas liée à l'objet partagé, elle spécifie simplement un chemin (invalide) pour rechercher des bibliothèques (-L, un argument -l est également nécessaire et probablement la bibliothèque partagée doit être nommée libmywrapper.so donc vous pouvez faire -Llib -lmywrapper) – nos

0

Modifier la signature de fonction dans wrapper.cpp à

extern "C" char* keygen() 

Sinon, il sera compilé avec un nom de style C++, et donc une fonction différente de celle déclarée dans l'en-tête.

+1

Non, la liaison doit seulement être spécifiée dans la déclaration initiale. –

0

Je SOLVED CE NUMÉRO PAR MOI-MÊME

Le problème est le lien de la bibliothèque. J'ai copié le fichier libmywrapper.so (je l'ai renommé) dans/usr/lib et lié avec -mywrapper Voilà :-)

Questions connexes