Как мне скомпилировать C ++ с Clang?

98

Я установил Clang с помощью apt-get в Ubuntu, и я могу успешно компилировать файлы C, используя его. Однако я понятия не имею, как через него скомпилировать C ++. Что мне нужно сделать для компиляции C ++?

питонический
источник

Ответы:

150

Команда clangпредназначена для C, а команда clang++- для C ++.

адл
источник
53

Я не знаю, почему нет ответа, прямо касающегося проблемы. Когда вы хотите скомпилировать программу на C ++, лучше всего использовать clang++. Например, у меня работает следующее:

clang++ -Wall -std=c++11 test.cc -o test

Если он скомпилирован правильно, он создаст исполняемый файл test, и вы можете запустить его, используя ./test.

Или вы можете просто использовать clang++ test.ccдля компиляции программы. Будет создан исполняемый файл по умолчанию с именем a.out. Используйте ./a.outдля запуска файла.

Весь процесс очень похож на g ++, если вы знакомы с g ++. Посмотрите этот пост, чтобы узнать, какие предупреждения включены в -Wallопцию. На этой странице показан список диагностических флагов, поддерживаемых Clang.

Примечание об использованииclang -x c++ : Ким Грасман говорит, что вы также можете использовать clang -x c++для компиляции программ cpp, но это может быть неверно. Например, у меня есть простая программа ниже:

#include <iostream>
#include <vector>

int main() {
    /* std::vector<int> v = {1, 2, 3, 4, 5}; */
    std::vector<int> v(10, 5);
    int sum = 0;
    for (int i = 0; i < v.size(); i++){
        sum += v[i]*2;
    }
    std::cout << "sum is " << sum << std::endl;
    return 0;
}                                                      

clang++ test.cc -o testбудет успешно компилироваться, но clang -x c++не будет, показывая много ошибок неопределенных ссылок. Так что я думаю, что они не совсем эквивалентны. Лучше clang++вместо этого clang -x c++при компиляции программ на C ++.

  • версия clang: 11.0.0
  • Платформа: Ubuntu 16.04
Jdhao
источник
5
Спасибо, что действительно ответили на вопрос.
Curyous 08
51

Кроме того, для потомков - Clang (например, GCC) принимает -xпереключатель для установки языка входных файлов, например,

$ clang -x c++ some_random_file.txt

Эта ветка списка рассылки хорошо объясняет разницу между clangи clang++: Разница между clang и clang ++

Ким Грасман
источник
5
У меня была ошибка компоновщика с clang -x c ++ при компиляции файла cpp с помощью #include <iostream>. -lstdc ++ флаг решил эту проблему.
Slav
1
Теперь у меня перед глазами исходный код Clang. Во время сборки (в Windows) сначала clang.exeвыполняется сборка , а затем копирование этого исполняемого файла в clang++.exe. Таким образом, это один и тот же исполняемый файл, только во время выполнения он проверяет свое собственное имя, чтобы определить, вести себя как компилятор C или C ++. HTH.
Serge Rogatch
Как примечание, вариант -x c++был очень полезным , чтобы дать как -extra-argк лязгом-Tidy , чтобы заставить его лечить .h файл, содержащий C ++ вместо С
Объявление N
Это слишком ограничивает, чтобы быть действительно полезным, если вы не соберете все из исходников. Лучше просто использовать clang++и позволить ему определять, какие файлы вы ему предоставляете. Когда проект может содержать .cppфайлы, .llфайлы (LLVM л) и .o, .a, .soа что нет файлов из сторонних библиотек, clang -x c++просто вырвет.
Sahsahae
Я также вижу ту же проблему, что и @Slav. Для очень простой программы clang++работает, но clang -x c++показывает множество неопределенных ссылочных ошибок (другие флаги такие же). Так что, думаю, лучше всего использовать clang++. Протестированная версия clang: 11.0.0.
jdhao
5

У меня была аналогичная проблема при сборке Clang из исходников (но не с sudo apt-get install. Это может зависеть от версии Ubuntu, которую вы используете).

Возможно, стоит проверить, clang++можно ли найти правильное расположение ваших библиотек C ++:

Сравните результаты g++ -v <filename.cpp>и в clang++ -v <filename.cpp>разделе "#include <...> поиск начинается здесь:".

Гай Адини
источник
1

решение 1:

  clang++ your.cpp

решение 2:

  clang your.cpp -lstdc++

решение 3:

   clang -x c++ your.cpp 
лиганд
источник
0

Откройте окно терминала и перейдите в каталог вашего проекта. Выполните эти наборы команд в зависимости от того, какой компилятор вы установили:

Чтобы скомпилировать несколько файлов C ++ с помощью clang ++:

$ clang++ *.cpp 
$ ./a.out 

Чтобы скомпилировать несколько файлов C ++ с использованием g ++:

$ g++ -c *.cpp 
$ g++ -o temp.exe *.o
$ ./temp.exe
бластуаз
источник