1

我似乎忘记了我的 C++ ...

我试图在不同的源代码中声明 C 中的一些函数,并在.h必要时包括适当的函数。它编译好;但问题出在链接期间,链接器抱怨已经定义了函数。

我什至尝试将函数定义为extern, (徒劳地)尝试仅声明函数并让实现仅在.c.

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

常见的.h

#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.hin的包含module1.cpp;另一个来自module1.hmodule2.hin的包含module2.cpp

我知道函数应该被声明,但我显然在做一个失礼。有人可以指出它在哪里吗?先感谢您。

4

3 回答 3

3

您的函数名称需要更改。已经有一些你提到的名字的函数(例如:open),它们可能被你链接到的东西所包含。

于 2009-04-01T11:01:10.697 回答
1

天,

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

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

让链接器知道没有进行名称修改?

高温高压

干杯,

于 2009-04-01T11:09:08.697 回答
0

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

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

再次感谢您的帮助。

于 2009-04-01T12:25:33.553 回答