gcc:在C ++应用程序中链接C库会导致“多个定义”错误

时间:2011-05-17 23:26:41

标签: c++ gcc multiple-definition-error

我有一个工作的C库,我想使用gcc链接到C ++应用程序,但链接器(g ++)给我“多重定义”错误。使用C应用程序和gcc它可以工作。   定义接口的标头都包含:

#ifdef __cplusplus 
extern "C" {
#endif

我使用“nm”命令检查了库,它确实有多个方法定义(所讨论的方法不是来自公共接口)。

我的问题是:

  1. 为什么我的图书馆有多个定义(有些有T,有些有U)?

  2. 如果包含该文件的应用程序是C应用程序(我使用-Wall构建),为什么它可以工作?

  3. 我是否需要任何特殊属性或使用特定的文件扩展名才能使其正常工作,或者我需要回到编程学校:)?

  4. 更多关注lib.a文件我可以看到其中一个对象包含两次。例如,我有两个部分用于同一个对象:

     obj1.o
     00000000     T    Method
    
     obj2.o
     00000000     T    Hello
    
     obj1.o
     00000000     T    Method
    

    我猜这是问题吗?

    非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

我的猜测是“#define BLAHBLAH_H ”和“#ifndef BLAHBLAH_H / #endif”设置在“extern”C“{}”之外。

答案 1 :(得分:1)

在玩完之后,我发现实际上整个命令行(它是一种具有自动编译和链接的复杂应用程序)在包含C库之前包含了--whole-archive参数。在--no-whole-archive之后移动库可以解决问题。

原始命令

   gcc -Wl,**--whole-archive** -l:otherlibs *-Llibpath -l:libname* Wl,**--no-whole-archive** -o myApp hello.c

修正了命令

   gcc -Wl,**--whole-archive** -l:otherlibs Wl,**--no-whole-archive** *-Llibpath -l:libname* -o myApp hello.c

感谢大家的帮助,对不起,如果我没有提供足够/准确的信息。

最好的问候