Eclipse CDT clang toolchain - не может удалить stdlibc ++ из параметров компоновщика, но может добавить libc ++, какой из них использует Eclipse? - PullRequest
0 голосов
/ 17 января 2020

По умолчанию Eclipse CDT (я использую 9.10 на Linux VM) связывается с libstdc ++, когда выбран набор инструментов clang. По какой-то причине эта опция не может быть удалена навсегда, она просто снова появится после закрытия меню настроек и повторного открытия.

Eclipse также не выдает мне никаких предупреждений или ошибок, если я добавлю libc ++ для ссылки, поэтому мой Программа компилируется с обоими флагами и работает просто отлично. Я также не получаю никаких подсказок, когда добавляю -stdlib=libc++, который тоже компилируется и работает нормально.

Меня не интересует, игнорирует ли Eclipse libc ++, когда включена библиотека libstdc ++.

Это выходные данные компилятора, которые я получил от игры с флагами:

1)
clang++ -std=c++17 -Wall -Wextra -Wpedantic -O3 -emit-llvm -c -fmessage-length=0 -o main.bc ../main.cpp 
clang++ -L/usr/lib/ -o "2015-19 P1 v2" main.bc -lc++ -lstdc++.

2)
clang++ -std=c++17 -Wall -Wextra -Wpedantic -O3 -emit-llvm -c -fmessage-length=0 -o main.bc ../main.cpp 
clang++ -L/usr/lib/ -o "2015-19 P1 v2" main.bc -lstdc++ -lc++

3)
clang++ -stdlib=libc++ -std=c++17 -Wall -Wextra -Wpedantic -O3 -emit-llvm -c -fmessage-length=0 -o main.bc ../main.cpp 
clang++ -L/usr/lib/ -o "2015-19 P1 v2" main.bc -lstdc++ -lc++

4)
clang++ -stdlib=libc++ -std=c++17 -Wall -Wextra -Wpedantic -O3 -emit-llvm -c -fmessage-length=0 -o main.bc ../main.cpp 
clang++ -L/usr/lib/ -o "2015-19 P1 v2" main.bc -lc++ -lstdc++

Что я хотел бы знать: для каждого из этих четырех размещений флагов, которое stdlib в конечном итоге компилирует с помощью моей программы

1 Ответ

0 голосов
/ 18 января 2020

Я нашел ответ на свой вопрос, и для полноты картины я опубликую его здесь.

Чтобы убедиться, что мой проект Eclipse CDT скомпилирован с libc ++, мне нужно было включите следующий флаг

-stdlib=libc++

в одну из этих настроек

a) Проект -> Свойства -> Сборка C / C ++ -> Настройки -> Настройки инструмента -> LLVM Clang ++ -> Команда (вставить после clang++)

b) Проект -> Свойства -> Сборка C / C ++ -> Настройки -> Настройки инструмента -> LLVM Clang ++ - > Разное -> Другие флаги

Мне также пришлось включить библиотеку c++ для компоновщика в

Project -> Properties -> Сборка C / C ++ -> Настройки -> Настройки инструмента -> LLVM Clang ++ linker -> Библиотеки -> Библиотеки (-l)

Существует удобный способ проверить, с кем связан stdlib, используя следующие code:

#include <iostream>
#include <string_view>

template<typename T>
constexpr auto print() {
  std::string_view name = __PRETTY_FUNCTION__;
  name.remove_prefix(name.find('=')+2);
  name.remove_suffix(1);
  return name;
}

int main() {
  std::cout << print<std::string>() << std::endl;
}

Будет выведено одно из следующих значений в зависимости от того, установлен флаг -stdlib или c ++ библиотеки установлены:

// libc++
std::__1::basic_string<char>

// libstdc++
std::__cxx11::basic_string<char>
...