2016-08-24 2 views
-3

Существует два двоичных файла, полученных из одного и того же исходного файла: один скомпилирован с clang ++ - 3.6, а другой с g ++ - 4.8. При вызове функции из stl (std :: unique, в частности) gdb приводит меня в тот же файл: /usr/include/c++/4.8/bits/stl_algo.h.Same STL-файлы с различными компиляторами

Я ожидал, что реализации будут разными для каждого компилятора. Разделяют ли clang и gcc части своих реализаций на C++?

+2

Зависит от того, как вы их используете. Они используют заголовки и библиотеку, которую им говорят использовать. –

ответ

1

Я ожидал, что реализации будут разными для каждого компилятора. Разделяют ли clang и gcc части своих реализаций на C++?

Это не то, что они используют одни и те же реализации на C++, скорее всего, оба компилятора по умолчанию ссылаются на одну и ту же стандартную библиотеку C++ в вашей системе.

Предполагаю, что вы находитесь на Linux, почти все программы, установленные из диспетчера пакетов, связаны с libstdC++ (предоставляется g ++).

По умолчанию, даже при компиляции с помощью clang ++ используется libstdC++, поэтому при включении iostream, например, он использует один из /usr/include/c++/4.8.

Если вы хотите связаться с LLVM с библиотекой ++, вам нужно установить «LibC++ - Дев» пакет (название может меняться в зависимости от вашего дистрибутива) и компилировать с помощью: -stdlib = LibC++ (вместо default: -stdlib = libstdC++).

пример:

test.cpp:

#include <iostream> 

    int main(int argc, char *argv[]) 
    { 
     std::cout << "Hello World!!!\n"; 

     return 0; 
    } 

компиляции с помощью:

$ clang++ -stdlib=libc++ -o test test.cpp 

будет использовать заголовок из/USR/включать/C++/v1 (от LLVM)

но скомпилирование с использованием:

$ clang++ -stdlib=libstdc++ -o test test.cpp 

# or (assuming the default on your system is libstdc++) 

    $ clang++ -o test test.cpp 

будет использовать заголовок из /usr/include/c++/4.8 (от г ++)

Смежные вопросы