С++ множественное объявление ошибки функции при связывании

StackOverflow https://stackoverflow.com/questions/704995

  •  22-08-2019
  •  | 
  •  

Вопрос

Кажется, я забыл свой C++...

Я пытаюсь объявить некоторые функции на C в отдельных источниках, включая соответствующие .h когда необходимо.Компилируется нормально;но проблема заключается во время компоновки, когда компоновщик жалуется на уже определенные функции.

Я даже пытался определить функции как extern, в (тщетной) попытке просто объявить функции и позволить реализации реализоваться только на .c.

Это сокращенное описание моего кода:

общий.ч

#include <stdio.h>

модуль1.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_ */

модуль2.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_*/

модуль1.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) {
    ....
}
...

модуль2.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;
}
...

Компиляция и связывание:

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

Как я уже сказал, компилируется нормально.Проблема возникает во время связывания, когда компоновщик «видит», что есть две реализованные функции из module1.h:один от включения module1.h в module1.cpp;а другой от включения module1.h вместе с module2.h в module2.cpp.

Я знаю, что функции должны быть объявлены, но я явно делаю оплошность.Может ли кто-нибудь указать, где это?Заранее спасибо.

Это было полезно?

Решение 3

Спасибо всем за ваши ответы и комментарии.Я разобрался с проблемой (она оказалась очень глупой вещью) и близок к ее решению (надеюсь).

Оказывается, он взят из другого включаемого файла (cfortran.h), который реализует уровень для использования вызовов функций C в Фортране (и наоборот).Это очень полезно, и я успешно использовал его до сих пор, но был «ослеплен» ошибками;В документации этого include указано, что следует соблюдать осторожность при использовании его в контексте C++ (а не в C), но это первый случай, когда это предупреждение действительно приводит к каким-либо последствиям.

Еще раз спасибо за вашу помощь.

Другие советы

Имена функций необходимо изменить.Уже существуют функции с некоторыми из упомянутых вами имен (пример: открыть), и они, вероятно, включены в то, на что вы ссылаетесь.

Добрый день,

Разве вам не нужно сообщать компилятору и компоновщику, что это C, а не C++, используя extern dec.?

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

сообщить компоновщику, что искажения имен не происходит?

ХТХ

ваше здоровье,

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top