由于在多个编译单元的情况下包含相同的头文件,因此避免多重定义

时间:2014-08-13 08:10:40

标签: c header-files multiple-definition-error

我有一个经常使用的函数f()。我希望f()位于头文件util.h中,以便我可以轻松使用f()而无需任何额外编译:

user1.c

#include "util.h"
int main(){
    f();
    return 0;
}

util.h

void f(){
    // do some job
}

user1.c的汇编:

gcc -o user1 user1.c

当有两个编译单元unit2.ounit3.o时,会出现问题。他们的源代码如下:

user2.c

#include "util.h"

void user2_function(){
     f();
     // do other jobs
}

user3.c

#include "util.h"
extern void user2_function();
int main(){
    f();
    user2_function();
    return 0;
}

当我尝试编译这些源代码时出现multiple definition of f错误,如下所示:

gcc -c user2.c
gcc -c user3.c
gcc -o user user2.o user3.o

问题是如何解决multiple definition问题?或者有更好的解决方案吗?

在实际案例中,util.h中有数百个函数,大约有50个不同的编译单元。

我试图避免使用库和实用程序函数的编译步骤,因为:

  1. 我使用了许多不同的平台。
  2. 我想知道是否有一个简单的解决方案,即不使用cmake等等。
  3. 我也使用交叉编译协处理器。
  4. 我希望编译实用程序函数时使用的标志与编译用户代码时使用的标志相同。

2 个答案:

答案 0 :(得分:7)

您实际上是在头文件中指定函数体。因此,目标代码将被发送到两个目标文件中,这是不允许/有效的。

要纠正这个问题:

  • 标记函数inline
  • 在头文件中只放置函数的前向声明,并在单独的源代码文件中指定正文,然后将其与其他源代码文件一起编译

答案 1 :(得分:2)

util.h更改为util.c

并使用包含

的新util.h
void f(); 

代替。