Seltsames problem beim Compilieren mit Libraries

G

guy_next_door

Grünschnabel
libtest.c:
Code:
#include <stdio.h>
#include "libtest.h"
void runTest()
{
printf("Test\n");
}
libtest.h:
Code:
#ifndef _LIBTEST_H_
#define _LIBTEST_H_
void runTest();
#endif
test.C:
Code:
#include "libtest.h"
int main(){
runTest();
}

Wenn ich das ganze kompilieren will:
gcc - fPIC -c libtest.c
ld -shared -soname libtest.so -o libtest.so -lc libtest.o
g++ -L. -Wall test.C -ltest -o test
bei der dritten Zeile die Fehlermeldung:
/tmp/cc8YTDWO.o: In function `main':
test.C:(.text+0x5): undefined reference to `runTest()'
collect2: ld returned 1 exit status

nm libtest.so ergibt:
0000000000200ea8 a _DYNAMIC
0000000000200fe8 a _GLOBAL_OFFSET_TABLE_
0000000000201008 A __bss_start
0000000000201008 A _edata
0000000000201008 A _end
U puts@@GLIBC_2.2.5
0000000000000328 T runTest

g++ bzw. gcc Version ist 4.2.1
GNU ld Version ist 2.17.50.0.5
Das ganze läuft unter OpenSuse 10.2
 
Zuletzt bearbeitet:
g++ ist doch der c++ compiler - ne lib mache ich immer so... Funktioniert ohne Probleme

gcc -O3 -shared -o libpferd.so intconv.o readline.o decimal2.o nullweg.o \
datum.o datumformat.o abbruch.o nonewline.o unstring.o mvc.o readpipe.o \
inspect.o werbistdu.o readhigh.o printdez.o umsetzuc.o holpid.o umstvnr.o makewords.o \
schaltjahr.o monatsletzter.o webcharumsetz.o
strip -s libpferd.so

Die einzelnen Objekte
decimal2.o: decimal2.c
gcc -O3 -fpic -c -o decimal2.o decimal2.c
 
Ups, hatte ich vergessen zu schreiben: Ich möchte eine mit gcc kompilierte Library in ein C++ Projekt einbinden. Da ich bisher vor allem unter Windows programmiert habe, und ich bisher wenig Linux/Unix Erfahrung habe, habe ich obiges Beispiel geschrieben, bei dem der gleiche Fehler, auftritt. Vielleicht hätte ich auch besser fragen sollen wie binde ich eine C Library in C++ ein?
 
Hier wurden C und C++ unzulässig vermischt. Dein nm-Aufruf zeigt, daß in der 'text section' bei Adresse '328h' die Funktion 'runTest' vorliegt.

Probier mal
g++ -c -o test.o test.C
nm test.o

Der C++-Compiler erzeugt für den Aufruf der 'runTest'-Funktion die Signatur '_Z7runTestv' - und das ist, was der Linker später erfolglos suchen wird.

Schau mal nach unter [32.4] bei
http://geneura.ugr.es/~jmerelo/c++-faq/mixing-c-and-cpp.html

Diese Präprozessor-Anweisungen bereitet den C++-Compiler darauf vor, für die runTest-Funktion einen C-Aufrufnamen zu erzeugen.

p.s.: Ich bin hier noch neu und suche die Anleitung, wie man diese interessanten Hervorhebungen, die Du für den Quellcode verwendet hast, erzeugt.
.
.
.
EDIT (autom. Beitragszusammenführung) :
.

- Ich hätte mir den Editor mal genauer ansehen sollen...

Code:
#ifndef _LIBTEST_H_
#define _LIBTEST_H_

#ifdef __cplusplus
  extern "C" {
#endif

void runTest();

#ifdef __cplusplus
  }
#endif

#endif /*_LIBTEST_H_*/
 
Zuletzt bearbeitet:

Ähnliche Themen

Funktion nicht gefunden

2 Module 1 Header kein Programm

Problem beim Kompilieren (Redhat 5)

Schwierigkeiten beim compillieren

NagiosGrapher 1.7.1 funktioniert nicht

Zurück
Oben