gcc:在C++应用程序中链接 C 库会导致"multiple definition of"错误
gcc: Linking C library in a C++ app results in "multiple definition of" errors
我有一个工作的 C 库,我想使用 gcc 链接到一个C++应用程序,但链接器 (g++) 给了我"多重定义"错误。使用 C 应用程序和 gcc,它可以工作。 定义接口的标头都包含:
#ifdef __cplusplus
extern "C" {
#endif
我使用"nm"命令检查了库,它确实有多个方法定义(有问题的方法不是来自公共接口)。
我的问题是:
为什么我的库有多个定义(有些有 T,有些有 U)?
如果包含文件的应用程序是 C 应用程序(我使用 -Wall 构建),为什么它会起作用?
我是否需要任何特殊属性或使用特定的文件扩展名来使其工作,或者我需要回到编程学校:)?
更加关注lib.a文件,我可以看到其中一个对象被包含两次。例如,我有两个部分用于同一对象:
obj1.o
00000000 T Method
obj2.o
00000000 T Hello
obj1.o
00000000 T Method
我想这就是问题所在?
任何帮助真的非常感谢。
我的疯狂猜测是"#define BLAHBLAH_H"和"#ifndef BLAHBLAH_H/#endif"设置在"extern"C"{}"之外。
在尝试之后,我发现实际上整个命令行(它是一种具有自动编译和链接的复杂应用程序)在包含 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
谢谢大家的帮助,如果我没有提供足够/准确的信息,很抱歉。
此致敬意
相关文章:
- 仅在使用 gradle 在 Travis CI 上编译时才"multiple definition" googletest 符号
- Qt5 C++中出现意外"Multiple definition"错误
- "multiple definition of"链接错误
- 编译mbed操作系统程序时"multiple definition of `main'"错误
- C++ 使用生成文件捕获框架'multiple definition'链接器错误
- 'Multiple Definition'错误
- 无缘无故地"Multiple definition"
- 使用 Qt 创建器时出错:"multiple definition" "first defined here"
- C++:" multiple definition of 'mainCRTStartup' "错误等
- "multiple definition of value"在 g++ 中编译具有未初始化全局但不是 gcc 的 C 程序时
- 调试"multiple definition of ..."错误的一般技术?
- 编写仅标头模板库时"Multiple definition of"错误
- C++, multiple definition
- 静态数组类变量"multiple definition" C++
- ffmpeg ndk multiple definition libavcodec.a(golomb.o)
- GNU GCC 编译器错误"multiple definition of main"
- 简单 qtest 失败,'multiple definition of main'
- 多个 c++ 文件导致"multiple definition"错误?
- 如何在多个类中使用库而不会出现"multiple definition"错误
- 使用 -Wall 而不是 -o 时出现"multiple definition of _start"错误