С обычной программой на 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
, Это не помогло.
Очевидно, я пропускаю что-то очевидное здесь.
Любые указатели на то, как я мог это исправить?
Переменные по умолчанию в Настройки → Переменные по умолчанию отключены.
Так что вам нужно включить TM_CXX_FLAGS
установив флажок в крайнем левом столбце.
Я смог обойти это, добавив -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)