我有一个经常使用的函数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.o
和 unit3.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 个不同的编译单元。
我试图避免使用库和实用函数的编译步骤,因为:
- 我使用许多不同的平台。
- 我想知道是否有一个简单的解决方案,即不使用
cmake
等。 - 我还对协处理器使用交叉编译。
- 我希望实用函数编译中使用的标志与用户代码编译中使用的标志相同。
最佳答案
您实际上是在头文件中指定函数的主体。因此,目标代码将被发送到两个目标文件中,这是不允许的/无效的。
要纠正此问题:
- 将函数标记为
内联
- 仅在头文件中放置函数的前向声明,并在单独的源代码文件中指定主体,然后将其与其他源代码文件一起编译
关于c - 在多个编译单元的情况下,避免由于包含相同的头文件而导致多重定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25281135/