c - 在多个编译单元的情况下,避免由于包含相同的头文件而导致多重定义

标签 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;
}

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

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

问题是如何解决多重定义问题?或者还有更好的解决方案吗?

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

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

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

最佳答案

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

要纠正此问题:

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

关于c - 在多个编译单元的情况下,避免由于包含相同的头文件而导致多重定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25281135/

相关文章:

c++ - 多重定义编译错误

c++ - 警告 : passing argument 2 of 'g_timeout_add_seconds' removal

无法检查C中函数的返回值

c - "Multiple definition", "first defined here"错误

c++ - 代码守卫失败,模板来自字符串文字

c++ - 头文件跨项目

c - SNMP查询获取UPS信息

python - 从 DLL 返回的 char[] 转换为 Python 字符串

c++ - 包含的 C++/C 头文件的实现在哪里?

xcode4 - iOS 项目的工作区和相关的一个静态库项目