Сборка C ++ 11 с TextMate?

С обычной программой на C ++ 98, чтобы запустить ее из TextMate, все, что мне нужно, это ⌘R, чтобы запустить ее из TextMate. С C ++ 11, однако, это не работает из коробки. Например, если у меня есть следующая программа:

#include <iostream>
using namespace std;

int main()
{
for (auto i : {1, 2, 3})
cout << i << " ";

cout << "\n";
}

Затем выполнение ⌘R приводит к следующим ошибкам сборки C ++ 11:

untitled:6:10: warning: 'auto' type specifier is a C++11 extension [-Wc++11-extensions]
for (auto i : {1, 2, 3})
^
untitled:6:17: warning: range-based for loop is a C++11 extension [-Wc++11-extensions]
for (auto i : {1, 2, 3})
^
untitled:6:19: error: cannot deduce type of initializer list because std::initializer_list was not found; include <initializer_list>
for (auto i : {1, 2, 3})
^
2 warnings and 1 error generated.

Эта программа работает нормально в Xcode или с простой make (у меня есть export CXXFLAGS="-std=c++0x” в моем .bashrc, который заботится о марке). Я также могу построить его из командной строки с clang++ -std=c++11 test.cpp, так что это не проблема компилятора, а что-то, что связано с моей конфигурацией TextMate.

Глядя на пакет TextMate Run, я вижу, что он ссылается TM_CXX_FLAGS, Из настроек TextMate я добавил -std=c++0x а также -Wc++11-extensions в TM_CXX_FLAGS, Это не помогло.

Очевидно, я пропускаю что-то очевидное здесь.

Любые указатели на то, как я мог это исправить?

2

Решение

Переменные по умолчанию в Настройки → Переменные по умолчанию отключены.

Так что вам нужно включить TM_CXX_FLAGS установив флажок в крайнем левом столбце.

2

Другие решения

Я смог обойти это, добавив -std = c ++ 11 в комплект Run, который выглядит немного обходным путем. Есть ли способ, которым я мог бы обновить TM_CXX_FLAGS глобально? (В настоящее время TextMate, похоже, не принимает мои изменения в TM_CXX_FLAGS, установленные в настройках TextMate)

Вот мой текущий обходной путь: (Это мой комплект Run. Единственное изменение, которое я сделал, это добавление -std = c ++ 11)

#!/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby

require "#{ENV['TM_SUPPORT_PATH']}/lib/tm/executor"require "#{ENV['TM_SUPPORT_PATH']}/lib/tm/save_current_document"require "shellwords"
CONFIG = {
'source.c'      => [ ENV['TM_GCC'] || 'xcrun clang',   "-x c             #{ENV['TM_C_FLAGS']      || '-Wall -include stdio.h'}",                                    'c'  ],
'source.cc'     => [ ENV['TM_GXX'] || 'xcrun clang++', "-x c++ -std=c++11          #{ENV['TM_CXX_FLAGS']    || '-Wall -include stdio.h -include iostream -Wc++11-extensions'}",                  'cc' ],
'source.c++'    => [ ENV['TM_GXX'] || 'xcrun clang++', "-x c++ -std=c++11          #{ENV['TM_CXX_FLAGS']    || '-Wall -include stdio.h -include iostream -Wc++11-extensions'}",                  'cc' ],
'source.objc'   => [ ENV['TM_GCC'] || 'xcrun clang',   "-x objective-c   #{ENV['TM_OBJC_FLAGS']   || '-Wall -include stdio.h -framework Cocoa'}",                   'm'  ],
'source.objc++' => [ ENV['TM_GXX'] || 'xcrun clang++', "-x objective-c++ #{ENV['TM_OBJCXX_FLAGS'] || '-Wall -include stdio.h -include iostream -framework Cocoa'}", 'mm' ],
}

cc, flags, ext = *CONFIG['source.objc++'] # default
cc, flags, ext = *CONFIG[$&] if ENV["TM_SCOPE"] =~ /\bsource\.(obj)?c(\+\+)?/

TextMate.save_if_untitled(ext)
TextMate::Executor.make_project_master_current_document
args = Shellwords.split(cc) << Shellwords.split(flags) << ENV["TM_FILEPATH"]
TextMate::Executor.run(args, :version_args => ["--version"], :version_regex => /\A([^\n]*) \(GCC\).*/m)
1

По вопросам рекламы [email protected]