以下代码段:
#include <string>
#include <iostream>
int main()
{
std::string s = std::to_string(5);
std::cout << s << std::endl;
return 0;
}
在给出以下选项时,无法与Windows上的Clang 3.6(以及gcc 4.8.2标题和库)链接:
clang++ -std=c++11 -static -O0 bug.cpp
请注意,使用-O2时,代码段会编译并链接正常,所以我怀疑它可能是某种铿锵声。
编辑1: 我忘记了链接错误:
F:/Programs/LLVM/bin/../lib/gcc/i686-w64-mingw32/4.8.2\libstdc++.a(string-inst.o):(.text$_ZNSs12_S_constructIPcEES0_T_S1_RKSaIcESt20forward_iterator_tag[__ZNSs12_S_constructIPcEES0_T_S1_RKSaIcESt20forward_iterator_tag]+0x0): multiple definition of
`char* std::string::_S_construct<char*>(char*, char*, std::allocator<char> const&, std::forward_iterator_tag)'
C:\Users\THEART~1\AppData\Local\Temp\bug-b5df09.o:(.text[__ZNSs12_S_constructIPcEES0_T_S1_RKSaIcESt20forward_iterator_tag]+0x0): first defined here
F:/Programs/LLVM/bin/../lib/gcc/i686-w64-mingw32/4.8.2\libstdc++.a(string-inst.o):(.text$_ZNSsC2IPcEET_S1_RKSaIcE[__ZNSsC2IPcEET_S1_RKSaIcE]+0x0): multiple definition of `std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string<char*>(char*, char*, std::allocator<char> const&)'
C:\Users\THEART~1\AppData\Local\Temp\bug-b5df09.o:(.text[__ZNSsC2IPcEET_S1_RKSaIcE]+0x0): first defined here
F:/Programs/LLVM/bin/../lib/gcc/i686-w64-mingw32/4.8.2/../../../../i686-w64-mingw32/bin/ld.exe: C:\Users\THEART~1\AppData\Local\Temp\bug-b5df09.o: bad reloc address 0x10 in section `.text[__ZSt9to_stringi]'
collect2.exe: error: ld returned 1 exit status
clang++.exe: error: linker (via gcc) command failed with exit code 1 (use -v to see invocation)
编辑2: 我被问到为什么我在编译标志中添加了静态标志。 我的目的是生成完整的静态链接可执行文件,而不需要一些gcc dll(libstdc ++ 6.dll libwinpthread.dll等),所以我大部分时间都在编译这个命令:
clang++ -std=c++11 -static -static-libstdc++ -static-libgcc -O0 bug.cpp
我一直在使用gcc来生成完整的静态可执行文件。 经过一些实验,我注意到-static和-O0标志的组合是有问题的,所以我省略了其他标志,不会产生任何混淆。