【问题标题】:Use C function in C++ program; "multiply-defined" error在 C++ 程序中使用 C 函数; “多重定义”错误
【发布时间】:2010-05-02 19:04:50
【问题描述】:

我正在尝试在我已经编写的 C++ 程序中使用this code for the Porter stemming algorithm。我按照文件末尾附近的说明将代码用作单独的模块。我创建了一个文件stem.c,它在定义之后结束并具有

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

它在 Xcode 中运行良好,但在带有 gcc 4.1.1 的 Unix 上对我不起作用——奇怪,因为通常我在两者之间移动没有问题。我得到了错误

ld: 致命的:符号 `stem(char*, int, int)' 是多重定义的: (文件/var/tmp//ccrWWlnb.o 类型=FUNC;文件/var/tmp//cc6rUXka.o 类型=FUNC); ld:致命:文件处理错误。没有输出写入集群

我在网上查了一下,似乎有很多地方我可能做错了,但我不确定头文件、外部“C”等的哪种组合会起作用。

【问题讨论】:

  • 您是否以某种方式将 C 文件包含在其他文件中?您用来编译/链接程序的命令行是什么?
  • 是的,在一个函数的 .cpp 文件中,我有 #include "stem.c"。用 g++ 编译 What.cpp Anotherthing.cpp stem.c -o myprogram.
  • 那是你的问题!顺便说一句,这与混合 C 和 C++ 没有任何关系。如果您有 #include 在另一个中编辑一个 .cpp 文件,也会发生同样的事情。

标签: c++ c include compiler-errors


【解决方案1】:

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

您可以在任意多个模块中声明符号。函数的声明如下所示:

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

您不需要“extern”关键字,尽管它不会造成任何伤害。对于函数声明,它是隐含的。

函数的定义如下所示:

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

“多重定义”错误表明您有两个具有相同功能的定义模块。这通常意味着您有两个定义函数的文件,或者两个文件,其中 #include 一个定义函数的文件。通常,您不应将函数定义放在您#include 的文件中。将定义放入 .c、.cpp 或 .cc 文件中,然后将声明放入您#include 的 .h 文件中。

例如,您可以在其中创建一个 stem.h 文件:

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

那么,#include "stem.h"

【讨论】:

  • 当然!我被 C 代码的不熟悉的方面分心了,以至于我没有看到这一点。谢谢你。我在 Xcode 中这样做时遇到了一个新错误,但它在 Unix 中有效,这很重要。
【解决方案2】:

Whatever.cpp 具有 #include "stem.c" 的事实提供了第一个定义,而在编译器命令行中指定 stem.c 提供了第二个定义。

您应该将 stem.c 分解为一个头文件(仅包含函数原型)和一个包含实现的 .c 文件。在whatever.cpp中只包含头文件

【讨论】:

    【解决方案3】:

    您需要添加“C”。您需要 extern "C" { ... } 并且只实际定义一次函数。但是您可以随意声明它(原型)。

    【讨论】:

    • 对于这个问题的情况,第一部分确实不正确。如果您需要能够从 C 代码调用的 C++ 函数,则只需要 extern "C"。在这种情况下,情况正好相反,从 C++ 代码调用 C 函数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-26
    • 1970-01-01
    相关资源
    最近更新 更多