3

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

#ifdef __cplusplus 
extern "C" {
#endif

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

我的问题是:

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

  2. 如果包含文件的应用程序是 C 应用程序(我正在使用 -Wall 构建),为什么它会起作用?

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

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

 obj1.o
 00000000     T    Method

 obj2.o
 00000000     T    Hello

 obj1.o
 00000000     T    Method

我想这是问题所在?

非常感谢任何帮助。

4

2 回答 2

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

感谢大家的帮助,如果我没有提供足够/准确的信息,我们深表歉意。

此致

于 2011-05-18T21:13:07.337 回答
1

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

于 2011-05-18T00:23:34.013 回答