C++ 带有铿锵+的未定义引用+;含氧

C++ 带有铿锵+的未定义引用+;含氧,c++,c++11,clang,clang++,libc++,C++,C++11,Clang,Clang++,Libc++,我在一个项目上尝试使用CLang 3.4和libc++时,在发布模式下出现了奇怪的链接错误: /home/wichtounet/dev/eddic/src/ast/Operator.cpp:17: error: undefined reference to 'std::__1::basic_ostream<char, std::__1::char_traits<char>>& std::__1::operator<< <char, std::_

我在一个项目上尝试使用CLang 3.4和libc++时,在发布模式下出现了奇怪的链接错误:

/home/wichtounet/dev/eddic/src/ast/Operator.cpp:17: error: undefined reference to
'std::__1::basic_ostream<char, std::__1::char_traits<char>>&
 std::__1::operator<< <char, std::__1::char_traits<char>, std::__1::allocator<char>>(
   std::__1::basic_ostream<char, std::__1::char_traits<char>>&,
   std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&
 )'
clang: error: linker command failed with exit code 1 (use -v to see invocation)
clang++ -v -use-gold -Iinclude -std=c++1y -stdlib=libc++ -Wextra -Wall -Qunused-arguments -Wuninitialized -Wsometimes-uninitialized -Wno-long-long -Winit-self -Wdocumentation -pedantic -isystem /home/wichtounet/build/modular-boost//include -L /home/wichtounet/build/modular-boost//lib -lboost_program_options -g -DLOGGING_DISABLE -DNDEBUG -O3 -march=native -fvectorize -fslp-vectorize-aggressive -fomit-frame-pointer -o release/bin/eddic "TONS OF DOT O"
clang version 3.4 (tags/RELEASE_34/final)
Target: x86_64-pc-linux-gnu
Thread model: posix
Selected GCC installation: /usr/lib/gcc/x86_64-pc-linux-gnu/4.8.2
 "/usr/bin/x86_64-pc-linux-gnu-ld" --eh-frame-hdr -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o release/bin/eddic /usr/lib/gcc/x86_64-pc-linux-gnu/4.8.2/../../../../lib64/crt1.o /usr/lib/gcc/x86_64-pc-linux-gnu/4.8.2/../../../../lib64/crti.o /usr/lib/gcc/x86_64-pc-linux-gnu/4.8.2/crtbegin.o -L/home/wichtounet/build/modular-boost//lib -L/usr/lib/gcc/x86_64-pc-linux-gnu/4.8.2 -L/usr/lib/gcc/x86_64-pc-linux-gnu/4.8.2/../../../../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -L/usr/lib/gcc/x86_64-pc-linux-gnu/4.8.2/../../../../x86_64-pc-linux-gnu/lib -L/usr/lib/gcc/x86_64-pc-linux-gnu/4.8.2/../../.. -L/lib -L/usr/lib -lboost_program_options "TONS OF DOT O" -lc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-pc-linux-gnu/4.8.2/crtend.o /usr/lib/gcc/x86_64-pc-linux-gnu/4.8.2/../../../../lib64/crtn.o
src/ast/Operator.cpp:15: error: undefined reference to 'std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::operator<< <char, std::__1::char_traits<char>, std::__1::allocator<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)'
clang: error: linker command failed with exit code 1 (use -v to see invocation)
/home/wichtounet/dev/eddic/src/ast/Operator.cpp:17:错误:未定义对的引用
'std::_u1::basic_ostream&

std::_1::运算符我在错误消息中注意到“std::_1::operator我对长期使用g++编译的代码有这个问题,试图使用clang++编译。同样的症状:对std::_1::basic_ostream的未定义引用,当从编译器选项中删除-O2时,它神奇地消失了。我发现的所有类似的报告都是错误地使用CLAN而不是CLAN+++编译C++代码,但我没有这样做:我使用CLAN+++。 我最终能够确定(对我来说)问题是在声明类的头(.h)文件中使用了
#include
(它只有iostream forward声明,以减少编译时间),但在实现该类的相应源(.cpp)文件中没有使用
#include


一旦我将
#include
添加到源文件并重新编译,这些未定义的引用错误就消失了。

我可以想象系统头会根据调试与发布版本更改它们包含的其他系统头。您是
#包含了
,还是依赖于其他一些有时包含它的头文件?是的,我包含在问题所在的文件中。另一个可能愚蠢的问题是:如果您的链接命令实际上使用的是“clang”而不是“clang++”,我看到的错误消息是“clang”而不是“clang++”在链接过程中,它不包括C++标准库。我现在链接到CLAN+++,但没有区别。编译和链接阶段都是直接用clang++完成的。它在O0和O1中工作得很好,但在O2中它不再工作了(O3和Ofast也一样)。您应该尝试使用
-v
标志输出编译和链接的不同命令行,并在调试和发布之间进行比较,并查找路径上的差异。例如,它是一个命名空间。我尝试将其放入全局名称空间,但没有改变任何内容。libc++在名为
\uu 1
std
的内联名称空间中定义其所有函数/类。这样做是为了允许将来的扩展。我认为这里的
\uu 1
没有问题。因此一个TU只看到一个模板声明,假设实例化已经在其他地方完成,并且需要它。另一个TU具有définition,但实际上只在调用未内联的优化级别发出函数。最后,LTO允许到处内联,再次隐藏问题。我想你是对的。
clang++ -v -use-gold -Iinclude -std=c++1y -stdlib=libc++ -Wextra -Wall -Qunused-arguments -Wuninitialized -Wsometimes-uninitialized -Wno-long-long -Winit-self -Wdocumentation -pedantic -isystem /home/wichtounet/build/modular-boost//include -L /home/wichtounet/build/modular-boost//lib -lboost_program_options -g -DLOGGING_DISABLE -DNDEBUG -O3 -march=native -fvectorize -fslp-vectorize-aggressive -fomit-frame-pointer -o release/bin/eddic "TONS OF DOT O"
clang version 3.4 (tags/RELEASE_34/final)
Target: x86_64-pc-linux-gnu
Thread model: posix
Selected GCC installation: /usr/lib/gcc/x86_64-pc-linux-gnu/4.8.2
 "/usr/bin/x86_64-pc-linux-gnu-ld" --eh-frame-hdr -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o release/bin/eddic /usr/lib/gcc/x86_64-pc-linux-gnu/4.8.2/../../../../lib64/crt1.o /usr/lib/gcc/x86_64-pc-linux-gnu/4.8.2/../../../../lib64/crti.o /usr/lib/gcc/x86_64-pc-linux-gnu/4.8.2/crtbegin.o -L/home/wichtounet/build/modular-boost//lib -L/usr/lib/gcc/x86_64-pc-linux-gnu/4.8.2 -L/usr/lib/gcc/x86_64-pc-linux-gnu/4.8.2/../../../../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -L/usr/lib/gcc/x86_64-pc-linux-gnu/4.8.2/../../../../x86_64-pc-linux-gnu/lib -L/usr/lib/gcc/x86_64-pc-linux-gnu/4.8.2/../../.. -L/lib -L/usr/lib -lboost_program_options "TONS OF DOT O" -lc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-pc-linux-gnu/4.8.2/crtend.o /usr/lib/gcc/x86_64-pc-linux-gnu/4.8.2/../../../../lib64/crtn.o
src/ast/Operator.cpp:15: error: undefined reference to 'std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::operator<< <char, std::__1::char_traits<char>, std::__1::allocator<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)'
clang: error: linker command failed with exit code 1 (use -v to see invocation)