我下面列出了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] 删除。
我来说两句