【问题标题】:error - "(.text+0x0): multiple definition of 'method' " (C program)错误 - “(.text+0x0): 'method' 的多重定义” (C 程序)
【发布时间】:2011-12-20 06:17:15
【问题描述】:

我目前有 2 个 C 程序和 1 个头文件,我必须将它们制作成 Makefile。我不熟悉将程序编译到 Makefile 中,但我知道基础知识。我输入:

cc -c file1.c

cc -c file2.c

cc file1.o file2.o

----- 我收到以下错误 -----

file2.o: In function 'method':

file2.c:(.text+0x0): multiple definition of 'method'

file1.o:file1.c:(.text+0x0): first defined here

collect2: ld returned 1 exit status

有什么问题?我听说过各种各样的事情,比如因为它们共享相同的头文件(头文件中定义了“方法”),编译器认为它们有两个。我不知道。大家觉得呢?

谢谢,

编辑: 感谢您的回复。如果“方法”是“结构”函数怎么办?将它移到其他地方仍然是一个好主意吗?我刚刚尝试过,现在我得到了一个“指向不完整类型的解引用指针”。

【问题讨论】:

  • 我明白了。谢谢大家!

标签: c makefile


【解决方案1】:

“方法”在头文件中定义。

你不应该那样做。如果您这样做,函数定义将进入所有包含导致链接错误的标头的文件,因为该方法将有多个版本。

您只需在头文件中声明该方法。在.c 文件中定义,对其进行编译并将其链接到调用此函数的目标文件。

【讨论】:

  • 你让我很开心。 Arduino 的问题是在头文件中定义了一个数组,尽管它被包装在一个包含块中。非常感谢!
【解决方案2】:

如果method 是一个定义在头文件中的小函数,你应该声明它static inline 例如喜欢

/// in header.h
static inline int sum(int x, int y) { return x+y; }

【讨论】:

    【解决方案3】:

    像这样制作你的头文件(ifndef 是为了确保它不会被多次包含):

    #ifndef MYHEADER_H_
    #define MYHEADER_H_
    
    extern void mymethod1(void); // only put declaration in headers
    extern void mymethod2(void);
    ... other stuff
    
    #endif
    

    【讨论】:

    • 在程序中定义包含双下划线的宏是无效的。
    • @Charles:我假设您在谈论如何为预定义的宏保留双下划线?
    • 不一定是宏,而是作为任何标识符,它们是为所有范围内的实现保留的。
    • @Charles:好的,感谢您指出这一点,因为很多旧的 C 代码都使用这种方式,我经常养成坏习惯(我会编辑我的答案)。
    【解决方案4】:

    您在 file2.c 和 file1.c 中都有方法定义。 尽量只将声明放在通用头文件中,并将定义移动到一个 c 文件中。

    【讨论】:

      【解决方案5】:

      将函数声明为静态函数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-09-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多