链接时C ++多次声明函数错误

时间:2009-04-01 10:52:12

标签: c++ function declaration

我好像忘记了我的C ++ ......

我正在尝试在不同的源中声明C中的某些函数,并在必要时包含相应的.h。编译好了;但问题是在链接期间,链接器抱怨已经定义的函数。

我甚至尝试将函数定义为extern,尝试仅仅声明函数并让实现仅在.c上实现。

这是我的代码的精简描述:

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;
}
...

编辑&amp;起重:

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.hmodule2.cpp的其他内容。

我知道这些函数应该被声明,但我显然是在做一个虚假的人。 有人可以指出它在哪里吗?提前谢谢。

3 个答案:

答案 0 :(得分:3)

您的功能名称需要更改。已经存在一些函数,其中包含您提到的一些名称(例如:open),它们可能包含在您链接的内容中。

答案 1 :(得分:1)

天儿真好,

您是否需要通过使用extern dec来告诉编译器和链接器这是C而不是C ++?

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

让链接器知道没有名称重复发生?

HTH

欢呼声,

答案 2 :(得分:0)

感谢大家的回复和评论。我发现了问题(事实证明这是一个非常愚蠢的事情)并且接近解决它(希望如此)。

事实证明它来自另一个包含文件(cfortran.h),它实现了一个在Fortran中使用C函数调用的层(反之亦然)。这是非常有用的,直到现在我一直在成功使用它,但我被错误“蒙蔽了”;包含的文档说明在C ++上下文中使用它时应该小心(不是在C中),但这是警告实际产生效果的第一个实例。

再次感谢您的帮助。