C ++ dichiarazione multiplo di errore di funzione quando il collegamento
-
22-08-2019 - |
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.
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,