【发布时间】:2014-08-13 08:10:39
【问题描述】:
我有一个经常使用的函数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等。 - 我还对协处理器使用交叉编译。
- 我希望编译实用程序函数时使用的标志与编译用户代码时使用的标志相同。
【问题讨论】:
-
如果要在多个文件中使用,要么在header中设为static,要么在header中声明并在自己的源文件中定义。尝试使用头文件中的非静态函数定义是......不会很好地工作。正如你所发现的,艰难的道路。
printf()等函数没有在<stdio.h>中定义是有原因的;就是这个! -
使用
static或static inline在运行时性能、TLB未命中计数、指令缓存未命中计数等方面是否有任何反作用?编译时间对我来说并不重要。 -
如果是静态的,那么每个包含头文件的文件都会得到一个函数的副本,不管它是否被使用,所以程序最终会得到函数代码的多个副本。如果您使用
static inline,则只有在您使用时才会生成代码。因此会浪费空间,而且如果大量使用它,您最终可能需要在内存中复制相同代码的多个副本,每个文件对应一个调用它的文件,这增加了指令缓存未命中的可能性。使用多个目标文件向程序添加一个额外的目标文件很容易。使用库使其更容易。
标签: c header-files multiple-definition-error