我有一个经常使用的函数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;
}
当我尝试编译这些源代码时出现multiple definition of f
错误,如下所示:
gcc -c user2.c
gcc -c user3.c
gcc -o user user2.o user3.o
问题是如何解决multiple definition
问题?或者有更好的解决方案吗?
在实际案例中,util.h
中有数百个函数,大约有50个不同的编译单元。
我试图避免使用库和实用程序函数的编译步骤,因为:
cmake
等等。答案 0 :(得分:7)
您实际上是在头文件中指定函数体。因此,目标代码将被发送到两个目标文件中,这是不允许/有效的。
要纠正这个问题:
inline
答案 1 :(得分:2)
将util.h
更改为util.c
并使用包含
的新util.h
void f();
代替。