2009-04-01 7 views
0

Verknüpfung scheine ich meine C zu vergessen ++ ...C++ mehrere Deklaration von Funktionsfehlern beim

Ich versuche, einige Funktionen in C in getrennten Quellen zu erklären, und einschließlich der entsprechenden .h bei Bedarf. Es kompiliert OK; aber das Problem ist während des Linkens, wo der Linker über bereits definierte Funktionen klagt.

Ich habe sogar versucht, die Funktionen als extern zu definieren, in einem (vergeblichen) Versuch, nur die Funktionen zu deklarieren und die Implementierung nur auf dem .c wahr werden zu lassen.

Dies ist eine gekürzte Beschreibung meines Code:

common.h

#include <stdio.h> 

module1.h

#include "common.h" 
#ifndef MODULE1_H_ 
#define MODULE1_H_ 
int init(int option); 
int open(char* db, char* username, char* password); 
int get(int handler, int date[2], int time[2], int* data, int& rowsize, int& numrows); 
int put(int handler, int* data, int& datasize, int& numrows); 
int close(int handler); 
int finalize(); 
#endif /* MODULE1_H_ */ 

module2.h

#include "common.h" 
#ifndef MODULE2_H_ 
#define MODULE2_H_ 
int get1(int handler, int date, int time, int *data, int& datasize, int& rowsize); 
int put1(int handler, int* data, int datasize); 
#endif /*MODULE2_H_*/ 

module1.cpp

#include "module1.h" 
int init(int option) { ... } 
int finalize() { ... } 
int get(int handler, int date[2], int time[2], int* data, int& rowsize, int& numrows) { 
    .... 
} 
... 

module2.cpp

#include "module1.h" 
#include "module2.h" 
int get1(int handler, int date, int time, int* data, int rowsize) { 
    int daterange[2]={date,date}; 
    int timerange[2]={time,time}; 
    int rsize, numrows, result; 
    result=get(handler, daterange,timerange, data, rsize, numrows); 
    rowsize=rsize; 
    if(numrows!=1) printf("Uh oh...\n"); 
    return result; 
} 
... 

Compilation & Verknüpfung:

g++ -o module1.o -c module1.cpp 
g++ -o module2.o -c module2.cpp 
g++ -fPIC -shared -o library.so module1.o module2.o 

Wie gesagt, es kompiliert OK. Das Problem ist während der Verknüpfung, wo der Linker "sieht", dass es zwei implementierte Funktionen von module1.h gibt: eine aus der Aufnahme von module1.h in module1.cpp; und die andere aus der Aufnahme von module1.h zusammen mit module2.h in module2.cpp.

Ich weiß, dass die Funktionen deklariert werden sollen, aber ich mache offensichtlich einen Faux-pas. Könnte jemand bitte darauf hinweisen, wo es ist? Vielen Dank im Voraus.

+0

Bitte geben Sie die aktuelle Fehlermeldung vom Linker ein. – SoapBox

+0

Ich schlage vor, Sie fügen Ihrer Frage eine bestimmte Linker-Fehlermeldung hinzu. Ihre Funktionsnamen können mit integrierten Funktionen in Konflikt stehen. –

+0

den tatsächlichen Code aus "include/ifx2f.h: 215", und die mehrere enthalten Guard für diesen Header. –

Antwort

0

Vielen Dank für Ihre Antworten und Kommentare.Ich habe das Problem herausgefunden (es stellte sich heraus, dass es eine sehr dumme Sache ist) und bin kurz davor, es zu lösen (hoffentlich).

Es stellt sich heraus, dass es von einer anderen Include-Datei (cfortran.h) kommt, die eine Schicht für die Verwendung von C-Funktionsaufrufen in Fortran implementiert (und umgekehrt). Es ist sehr nützlich und ich habe es bis jetzt mit Erfolg benutzt, aber ich wurde von den Fehlern "geblendet"; Die Dokumentation dieses Includes besagt, dass Vorsicht geboten ist, wenn es im C++ - Kontext (nicht in C) verwendet wird, aber dies ist die erste Instanz, bei der diese Warnung tatsächlich Effekte erzeugt.

Nochmals vielen Dank für Ihre Hilfe.

+0

Mit anderen Worten: Das Problem kommt von der Verwendung von cfortran.h; Wenn ich es weglasse, geschieht die Kompilierung und Verknüpfung ohne Probleme. – jbatista

3

Ihre Funktionsnamen müssen geändert werden. Es gibt bereits Funktionen mit einigen der von Ihnen erwähnten Namen (Beispiel: open) und sie werden wahrscheinlich von etwas eingeschlossen, mit dem Sie verlinken.

+0

"Öffnen" ist nur ein Beispiel; In meinem Projekt heißt es "ifxopen". Wenn du sagst, dass "es schon Funktionen gibt ...", meinst du, sie sind "Standard" -Funktionen, oder meinst du, es ist eine Namenskollision in diesem speziellen Projekt? – jbatista

+0

Was ist der genaue Verknüpfungsfehler? –

+0

Beispiel:
src/ifx4cldb.o: In Funktion 'ifxcount_ ':
umfassen/ifx2f.h: 215: multiple Definition von' ifxcount_'
src/ifx2f.o: include/ifx2f.h: 215: Erste hier definiert – jbatista

1

G'day,

nicht benötigt werden, die Compiler und Linker zu sagen, dass diese C und nicht C++ durch den externen Dezember verwenden.?

extern "C" { 
    #include "my_bits_of_C.h" 
} 

um den Linker wissen zu lassen, dass es keinen Namensmangel gibt?

HTH

prost,