2010-05-02 79 views
3

我想在我已经编写的C++程序中使用this code for the Porter stemming algorithm。我按照文件末尾附近的说明将代码作为单独的模块使用。我创建了一个文件,stem.c,定义后结束,并且具有在C++程序中使用C函数; “多重定义”错误

extern int stem(char * p, int i, int j) ... 

它好工作在Xcode,但它不为我在Unix上用gcc 4.1.1工作 - 因为平时我没有怪在两者之间移动的问题。我得到的错误

LD:致命:符号`干(字符*,INT,INT)”是多重定义: (文件/var/tmp//ccrWWlnb.o类型= FUNC;文件/ var /tmp//cc6rUXka.o type = FUNC); ld:fatal:文件处理错误。没有输出写入群集

我在网上看过,似乎有很多事情我可能有错,但我不知道什么头文件,外部“C”等组合工作。

+0

你是否以某种方式#在其他文件中包含C文件?你用什么命令行来编译/链接你的程序? – nos 2010-05-02 19:11:36

+0

是的,在一个函数的.cpp文件中,我有#include“stem.c”。使用g ++编译Whatever.cpp Anotherthing.cpp stem.c -o myprogram。 – eom 2010-05-02 19:13:27

+2

那是你的问题!顺便说一下,这与混合使用C和C++没有任何关系。同样的事情会发生,如果你有'#包含一个.cpp文件在另一个。 – 2010-05-02 19:19:33

回答

12

该错误意味着符号(词干)是在多个模块中定义为

,只要你想你可以声明在尽可能多的模块的符号。函数的声明看起来是这样的:

int stem(char * p, int i, int j); 

您不需要“外部”的关键字,但它不会伤害任何东西。对于函数声明,这是隐含的。

函数的定义看起来是这样的:

int stem(char * p, int i, int j) 
{ 
    /* body of your function */ 
} 

的“多重定义”错误表明你有一个定义具有相同功能的两个模块。这通常意味着你有两个定义函数的文件,或者两个文件包含一个定义该函数的文件。通常情况下,您不应该将函数定义放入#include的文件中。把定义在.C,的.cpp或.cc文件,只是把一个声明在您#包括.h文件。

例如,你可以在它创建这个文件stem.h:

int stem(char * p, int i, int j); 

然后,#include "stem.h"

+0

当然! C代码的不熟悉的方面让我感到如此分心,以至于我没有看到这一点。谢谢。我在Xcode中以这种方式得到了一个新的错误,但它在Unix中起作用是非常重要的。 – eom 2010-05-03 01:37:44

0

该Whatever.cpp具有的#include“stem.c”提供第一个定义,并且编译器命令行上指定stem.c提供第二定义的事实。

你应该改掉stem.c成一个头文件(只需函数原型)和包含FPGA实现.c文件。只包含头文件在Whatever.cpp中

0

您需要添加“C”。你需要extern“C”{...},只实际定义一次函数。但是你可以随心所欲地声明它(原型)。

+0

这个问题的第一部分确实不适用于这个问题。如果您需要可以从C代码调用C++函数,则只需要'extern“C”'。在这种情况下,这是另一种方式,C函数正在从C++代码中调用。 – 2010-05-02 23:42:25