Frage

Ich scheine meine C zu vergessen ++ ...

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

Ich habe sogar versucht, die Funktionen als extern definieren, in einem (vergeblich) versucht, nur die Funktionen zu erklären und lassen Sie die Umsetzung nur auf dem .c wahr werden.

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 Verknüpfung, wo der Linker „sieht“, dass es zwei implementierten Funktionen von module1.h: einem aus der Aufnahme von module1.h in module1.cpp; und die andere aus der Einbeziehung von module1.h zusammen mit module2.h in module2.cpp.

Ich weiß, dass die Funktionen sollen deklariert werden, aber ich bin offensichtlich ein faux-pas zu tun. Könnte jemand bitte zeigen, wo es ist? Vielen Dank im Voraus.

War es hilfreich?

Lösung 3

Vielen Dank für Ihre Antworten und Kommentare. Ich habe herausgefunden, das Problem (es stellte sich eine sehr dumme Sache sein out) und bin in der Nähe der Lösung von (hoffentlich).

Es stellt sich heraus, dass es von einem anderen kommt Include-Datei ( cfortran.h ), die eine Schicht für die Verwendung von C-Funktionsaufrufen in Fortran implementiert (und umgekehrt). Es ist sehr nützlich, und ich habe es mit Erfolg bis jetzt, aber ich wurde „blind“ durch die Fehler; dass ist in der Dokumentation heißt es, dass darauf geachtet werden soll, wenn es in C ++ Kontext (nicht in C), aber dies ist das erste Beispiel, wo diese Warnung Effekte tatsächlich produziert.

Vielen Dank nochmals für Ihre Hilfe.

Andere Tipps

müssen Ihre Funktionsnamen geändert werden. Es gibt bereits Funktionen mit einigen dieser Namen, die Sie erwähnt (Beispiel: offen ) und sie werden wahrscheinlich durch etwas, das Sie eine Verknüpfung zu enthalten sind.

G'day,

Sie nicht benötigen Sie die Compiler und Linker zu sagen, dass diese C und nicht C ++ durch den externen Dezember verwendet wird.

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

die Linker wissen zu lassen, dass es kein Namen Mangeln ist los?

HTH

prost,

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top