gpt4 book ai didi

c++ - 链接错误 : Duplicate Symbol

转载 作者:搜寻专家 更新时间:2023-10-31 01:30:02 27 4
gpt4 key购买 nike

下面列出了 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 编译的,因此预处理器在每个文件中单独包含 header a.h,当需要链接时,链接器会找到符号 a 的两个版本.

如何声明一个可在我的整个程序中使用的类实例(在本例中为 a)并避免上述链接错误?

引用

我在 Mac OS X 10.13.3 上使用 gcc-7 (gcc-7 (Homebrew GCC 7.2.0_1) 7.2.0) -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,您可以利用新的 inline variables语言特征:

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

inline 变量现在的行为方式与 inline 函数相同:a 的多个定义合并为一个。

关于c++ - 链接错误 : Duplicate Symbol,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48693304/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com