Domanda

Mi sembra di dimenticare la mia C ++ ...

Sto cercando di dichiarare alcune funzioni in C nelle fonti diverse, e tra cui il .h appropriato quando necessario. Compila OK; ma il problema è durante il collegamento, in cui il linker lamenta funzioni già in corso di definizione.

Ho anche cercato di definire le funzioni come extern, in un (vano) tentativo di dichiarare solo le funzioni e lasciare che l'applicazione si avvera solo sul .c.

Questa è una descrizione abbreviata del mio codice:

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 & collegamento:

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

Come ho detto, si compila OK. Il problema è durante il collegamento, in cui il linker "vede" che ci sono due funzioni implementate da module1.h: uno dall'inclusione di module1.h in module1.cpp; e l'altro dalla inclusione di module1.h insieme module2.h in module2.cpp.

So che le funzioni dovrebbero essere dichiarati, ma sto ovviamente facendo un passo falso. qualcuno potrebbe per favore precisare dove si trova? Grazie in anticipo.

È stato utile?

Soluzione 3

Grazie a tutti per le vostre risposte e commenti. Ho capito il problema (si è rivelato essere una cosa molto stupida) e sono vicino alla sua soluzione (si spera).

Si scopre che proviene da un altro file di inclusione ( cfortran.h ) che implementa un layer per utilizzando chiamate di funzione C in Fortran (e viceversa). E 'molto utile e ho usato con successo fino ad ora, ma mi è stato "accecato" dagli errori; che gli stati di documentazione che si deve prestare attenzione quando lo si utilizza in C ++ contesto (non in C), ma questo è il primo caso in cui questo avvertimento in realtà produce effetti di includere.

Grazie ancora una volta per il vostro aiuto.

Altri suggerimenti

I vostri nomi delle funzioni devono essere cambiate. Ci sono già le funzioni con alcuni di quei nomi che hai citato (Esempio: aperto ) e sono probabilmente di essere inclusi da qualcosa che si sta facendo riferimento.

Buongiorno,

Non è necessario dire al compilatore e linker che si tratta di C e non C ++ utilizzando l'extern dicembre?

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

per lasciare che il linker sa che non c'è nessun nome storpiatura succedendo?

HTH

applausi,

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top