Я пробую 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)
Все нормально компилируется. Программа правильно связывается в режиме отладки, но не работает, когда я использую O2. В O0, O1 и Os все работает нормально, а в O2, O3, Os не линкуется. Я также пробовал в режиме LTO, и он отлично работает.
Я пробовал две версии libc++, но безрезультатно.
Код мне не кажется плохим:
std::ostream& ast::operator<< (std::ostream& stream, ast::Operator op){
std::string value = "asd";
return stream << value;
}
но у меня нет простого примера, вызывающего проблему.
clang++ используется как для сборки, так и для компоновки кода. Я использовал "-std=c++1y -stdlib=libc++" для компиляции и то же самое плюс некоторые библиотечные материалы для компоновки.
Что может быть причиной этого?
РЕДАКТИРОВАТЬ: Полный вызов шага ссылки в режиме выпуска:
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)
#include <string>
или полагаетесь на какой-то другой заголовок, который иногда включает его для вас? - person Casey   schedule 10.04.2014#include <string>
обычно приводит к ошибке времени компиляции, а не к ошибке ссылки. Однако использованиеclang
вместоclang++
, скорее всего, вызовет проблемы со ссылками. - person Adam H. Peterson   schedule 10.04.2014/usr/bin/ld
неправильно. Он не будет автоматически добавлять библиотеки времени выполнения C++. Попробуйте скомпоновать с помощьюclang++
(который способен как компилировать, так и линковать). Если вы используете/usr/bin/ld
, вам нужно будет самостоятельно добавить стандартные библиотеки C++ в строку ссылок, и если вы делаете это сейчас, возможно, вы добавляете только отладочную версию библиотек (которая не обязательно будет иметь те же символы, что и библиотеки ссылок, что может привести к проблемам с компоновкой). - person Adam H. Peterson   schedule 11.04.2014-std=c++11
? Если да, то что происходит на уровне оптимизации проблемы? - person Mike Kinghan   schedule 13.04.2014-v
для вывода разных командных строк компиляции и компоновки и сравнить их между отладкой и выпуском и, например, найти разницу в путях. - person galop1n   schedule 13.04.2014-v
, но и-save-temps
и сравнивать временные файлы.. Вы можете повторить команду компоновщикаld
с добавленной опцией--no-demangle
; тогда вы сможете найти временные файлы для проблемной функции. (ps, пожалуйста, проверьте, чистите ли вы проект между экспериментами) - person osgx   schedule 14.04.2014-nostdinc++ -Ipath/to/libcxx/include -Lpath/to/libcxx/lib
? - person mockinterface   schedule 16.04.2014