2

我有一个经常使用的功能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. 我希望编译实用程序函数时使用的标志与编译用户代码时使用的标志相同。
4

2 回答 2

7

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

要纠正此问题:

  • 标记功能inline
  • 仅在头文件中放置函数的前向声明,并在单独的源代码文件中指定主体,然后将其与其他源代码文件一起编译
于 2014-08-13T08:12:46.543 回答
2

改变util.hutil.c

并使用一个新util.h的包含

void f(); 

反而。

于 2014-08-13T08:19:56.537 回答