链接错误:符号重复

用户名

我下面列出了4个源文件:

//a.h

#pragma once

namespace proj {
class A {} a;
} // namespace proj

//b.h

#pragma once

namespace proj {
int foo();
} // namespace proj

// b.cpp

#include "proj/a.h"

namespace proj {
int foo() {
  A b = a;
  return 0;
}
} // namespace proj

// c.cpp

#include "proj/a.h"
#include "proj/b.h"

using namespace proj;

int main() {
  A b = a;
  foo();
  return 0;
}

当我尝试编译时c.cpp,出现以下链接错误:

duplicate symbol proj::a      in:
    buck-out/gen/proj/c#compile-c.cpp.ob5f76e97,default/c.cpp.o
    buck-out/gen/proj/b#default,static/libb.a(b.cpp.o)
duplicate symbol ___odr_asan._ZN4proj1aE in:
    buck-out/gen/proj/c#compile-c.cpp.ob5f76e97,default/c.cpp.o
    buck-out/gen/proj/b#default,static/libb.a(b.cpp.o)
ld: 2 duplicate symbols for architecture x86_64
collect2: error: ld returned 1 exit status

Build failed: Command failed with exit code 1.
stderr: duplicate symbol proj::a      in:
    buck-out/gen/proj/c#compile-c.cpp.ob5f76e97,default/c.cpp.o
    buck-out/gen/proj/b#default,static/libb.a(b.cpp.o)
duplicate symbol ___odr_asan._ZN4proj1aE in:
    buck-out/gen/proj/c#compile-c.cpp.ob5f76e97,default/c.cpp.o
    buck-out/gen/proj/b#default,static/libb.a(b.cpp.o)
ld: 2 duplicate symbols for architecture x86_64
collect2: error: ld returned 1 exit status

我认为发生这种情况是因为b.cpp是独立于c.cpp进行编译的,因此预处理器在每个文件中分别包含标头ah,并且当需要链接时,链接器会找到符号a的两个版本。

如何声明a在整个程序中可用的类的一个实例(在这种情况下),并避免上述链接错误?

参考

gcc-7 (Homebrew GCC 7.2.0_1) 7.2.0在Mac OS X 10.13.3上使用带有的gcc-7(-std=c++17

建立系统

这应该与问题无关,但无论如何都应包括在内,以防有人觉得有帮助。

我正在使用buck来编译具有以下BUCK文件的代码(尽管这应该无关紧要):

cxx_library(
    name='a',
    exported_headers=['a.h'],
    visibility=['PUBLIC'],
)

cxx_library(
    name='b',
    exported_headers=['b.h'],
    srcs = ['b.cpp'],
    deps = [':a'],
    visibility=['PUBLIC'],
)

cxx_binary(
    name='c',
    srcs = ['c.cpp'],
    deps = [':a', ':b'],
)
巴里

由于此标记为C ++ 17,因此可以利用新的内联变量语言功能:

namespace proj {
    class A {};
    inline A a;
} // namespace proj

inline现在,变量的行为与inline函数相同:将多个您的定义a折叠为一个。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Qt外部库重复符号链接错误

Firebase CocoaPods出现重复的符号链接器错误

C ++重复符号链接器错误以及适当的包含防护?

由于循环引用导致链接器“重复符号”错误

符号重复Apple Mach-O链接器错误

Apple Mach-O链接器错误-重复的符号

iOS中的链接器错误(架构x86_64的重复符号)

Xamarin.iOS绑定引发“错误MT5212:本机链接失败,符号重复”

本机链接错误:架构 x86_64 的 1 个重复符号

Xcode 10b5-重复的符号链接器错误,无法使用Crashlytics进行编译

在Xcode中使用-force_load链接器标志会导致符号重复错误

项目库中的Apple Mach-O链接器错误重复符号

由于libWeANDSFLibrary.a(ASIReachability.o)而导致的重复符号链接器错误

创建符号链接:协议错误

ldconfig错误:不是符号链接

powershell:错误的符号链接解析

链接器由于符号重复而失败

Google服务-链接上的符号重复

Apple Mach-O链接器错误-ld:体系结构armv7的1个重复符号

clang:错误:链接器命令失败,退出代码为1(使用-v查看调用),且符号重复

在以下位置修复错误重复符号_response:....:链接器命令失败,退出代码为1(使用-v查看调用)

架构armv7错误的重复符号

添加OpenKit时出现重复符号错误

NSManagedObject子类中的重复符号错误

xCode:目标C:重复符号错误

如何解决重复符号错误?

访问符号链接时出现错误403

为什么链接符号的语法是错误的

链接 C++ 和 Fortran 时出现重复符号