LINUX.ORG.RU

Сообщения one_more_hokum

 

Кросс-компиляция glibc из винды в aarch64

Решил на старости лет собрать кросс-компилятор GCC из-под MSys2 (windows) в aarch64 для linux-а.

binutils собрались корректно, 1-stage gcc тоже, заголовки ядра линукса встали, куда просил, а вот с glibc возникла проблема: при входе в поддиректорию elf выдаёт ошибку 'rtld-Rules:40: *** This makefile is a subroutine of elf/Makefile not to be used directly. Stop.'

В каталоге сборки файл librtld.mk содержит пустую переменную rtld-subdirs. Какие параметры нужно передавать configure, чтобы корректно собрать glibc?

 , , ,

one_more_hokum
()

Как оставить в выходном файле неиспользуемую явно функцию?

Если линкеру задать опции --gc-sections, а компилятору -ffunction-sections, из выходного файла будут выкинуты функции, к которым нет явного обращения. Размер выходного файла заметно уменьшится, это хорошо. А плохо то, что в прошивке присутствует одна функция, не используемая явно, но сильно нужная, которую линкер радостно и выкидывает.

Вопрос: как объяснить линкеру, что выкидывать можно всё, кроме вот этой вот функции? Линкер и компилятор — из набора GCC.

 , ,

one_more_hokum
()

Различия между boost::enable_if и std::enable_if

Вот код, который построил Джек:

#include <cstdint>
#include <type_traits>
//-------------------------------------------------------------------------
#include <boost/utility/enable_if.hpp>
#include <boost/type_traits/is_fundamental.hpp>
//-------------------------------------------------------------------------
template <typename T, typename Predicate = void> struct BoostTest;
template <typename T> struct BoostTest <T, typename boost::enable_if<boost::is_integral<T>>::type> { };
//-------------------------------------------------------------------------
template <typename T, typename Predicate = void> struct StdTest;
template <typename T> struct StdTest <T, typename std::enable_if<std::is_integral<T>::value_type>::type> { };
//-------------------------------------------------------------------------
int main(int argc, char** argv)
{
  StdTest<int> stdOk;       // Err???
  StdTest<float> stdErr;    // Err
  BoostTest<int> boostOk;   // Ok
  BoostTest<float> boostErr;// Err
  return 0;
}
На строке, где вызывается stdlib-ская реализация enable_if для проверки целочисленного типа g++ ругается на incomplete type and cannot be defined, как и в случае проверки float-а. Boost-овская реализация же срабатывает так, как и ожидалось. Что нужно сказать std::enable_if, чтобы в таком коде она корректно распознавала std::is_integral?

Компилятор: MinGW32-gcc 4.8.1

boost: 1.55

 , ,

one_more_hokum
()

Атомарные операции в ARM Cortex-M4

В документации сказано, что STREX возвращает единицу, и не трогает память по заданному адресу, если видит, что другой поток или процесс выполнил обращение к памяти в промежутке между LDREX и STREX. А по каким признакам определяется жизнедеятельность другого процесса/потока? Как ядро определяет, что память трогал именно другой процесс/поток?

 

one_more_hokum
()

Сборка плагина к кросскомпилятору GCC — кем собирать?

Самим кросскомпилятором, или тем, кем кросс был собран? Кросс, если что, вот этот.

one_more_hokum
()

Как работает std::enable_if без явного указания типа?

Вот в документации type_traits специализируется булевым true, и типом T, который через typedef выглядывает наружу. И тут же, в примере, рядом с

typename std::enable_if<std::is_integral<T>::value,bool>::type
находится
typename std::enable_if<std::is_integral<T>::value>::type>
без явного указания типа. Как это работает? Откуда выводится (выдумывается) тип?

one_more_hokum
()

Допустимо ли использовать функции/классы stdlib, начинающиеся с двойного подчёркивания?

Собссно, subj. В проекте использовался шаблон boost::mpl::and_. От boost-а захотелось отвязаться. В файле type_traits стандартной библиотеки был найден шаблон std::__and_. Насколько корректно его применять в коде?

one_more_hokum
()

Задание количества подстановочных аргументов (placeholders)

При попытке распарсить в одном правиле больше девяти аргументов валятся ошибки о некорректности подстановочных символов qi::_10, qi::_11 и т.д., хотя задан define, требуемый документацией. Где я ошибся, и как это поправить?

 , , ,

one_more_hokum
()

boost::thread, join и exception

Правильно ли я понимаю, что для получения boost::thread_interrupted от join-а потока необходимо до него вызвать на этот поток interrupt? Заранее спасибо.

one_more_hokum
()

Экспертам по всему, транспортный налог.

Вот интересно мне стало, в соответствующей статье НК РФ про тот самый транспортный налог расписываются всякие мелочи и подробности того, как выплачивать этот налог, но ни слова о том, куда, на какие цели, должны идти мною уплаченные деньги. Есть ли вообще возможность (хоть в одной стране мира) получить официальное объяснение, на какие цели должен быть истрачен конкретный налог? Или же налоговая база формируется «от балды», типа «А давайте введём налог на вот эту херню? — А отчего бы и не ввести?».

one_more_hokum
()

Mercurial, notify

Есть «главный» репозиторий hg, в который складываются результаты работы, и есть «клиенты» hg, которые эти результаты туда, соответственно, складывают. Хочется настроить оповещения по электропочте о прибытии diff-ов в «главный» репозиторий. Вопрос в том, кто должен заниматься оповещением. Hg «главного» репозитория, или тот hg, кто отправил diff?

one_more_hokum
()

Подслушанное только что

По поводу реализации работы со списками в Python: «Я такого пока ещё не видел, явно откуда-то спёрли...».

one_more_hokum
()

[C++, boost::spirit::phoenix, std::get] Обернуть std::get в phoenix-овскую function

Доброго всем времени суток. Случилась такая проблема: при попытке завернуть std::get в функциональный объект boost::spirit::phoenix вываливается здоровенный листинг ошибок на предмет того (как я смог понять), что такую сигнатуру использовать не получится. Как можно заставить собираться нижеприведённый код, и можно ли это сделать вообще?

#include <tuple>
#include <vector>
#include <string>
#include <iostream>
//--------------------------------------------------------------------------
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix.hpp>
//--------------------------------------------------------------------------
/*
  g++ -Wall -std=gnu++0x -o ./main ./main.cpp
*/
//--------------------------------------------------------------------------
namespace qi = boost::spirit::qi;
namespace ph = boost::phoenix;
//--------------------------------------------------------------------------
typedef std::tuple<int,int,float> TpPointsTuple;
typedef std::vector<TpPointsTuple> TpPointsTempStorage;
//--------------------------------------------------------------------------
struct phoenix_get_impl
{
  template <std::size_t I,typename... Args>
  struct result
  {
    typedef typename std::tuple_element<I,std::tuple<Args...>>::type type;
  };
  template <std::size_t I,typename... Args>
  typename result<I,Args...>::type& operator () (std::tuple<Args...>& t)
  {
    return std::get<I> (t);
  }
};
ph::function<phoenix_get_impl> const phoenix_get = phoenix_get_impl();
//--------------------------------------------------------------------------
struct phoenix_make_tuple_impl
{
  template <typename... Args>
  struct result
  {
    typedef std::tuple<Args...> type;
  };
  template <typename... Args>
  typename result<Args...>::type operator () (Args... args) const
  {
    return std::make_tuple(args...);
  }
};
ph::function<phoenix_make_tuple_impl> const phoenix_make_tuple = phoenix_make_tuple_impl();
//--------------------------------------------------------------------------
template <typename Iterator>                    \
struct TpPointsParser : qi::grammar             \
<Iterator,TpPointsTempStorage(),qi::space_type> \
{
  TpPointsParser(void) : TpPointsParser::base_type(start)
  {
    int_strong %= qi::int_ >> !(qi::punct >> *qi::digit);
    sectionName = qi::alpha >> *qi::alnum >> qi::lit('=');
    requiredData = (int_strong >> int_strong >> -qi::float_)  \
      [phoenix_make_tuple(qi::_1,qi::_2,qi::_3)];
    start = sectionName >> requiredData         \
      //[ph::push_back(qi::_val,qi::_1)];
      [std::cerr << phoenix_get.operator () <0> (qi::_1)];
    return;
  }
  qi::rule<Iterator,int()> int_strong;
  qi::rule<Iterator,void(),qi::space_type> sectionName;
  qi::rule<Iterator,TpPointsTuple(),qi::space_type> requiredData;
  qi::rule<Iterator,TpPointsTempStorage(),qi::space_type> start;
};

//--------------------------------------------------------------------------
int main(int argc,char** argv)
{
//#define USE_IT
#ifdef USE_IT
  std::tuple<int,int> t(100500,9000);
  phoenix_get_impl pgi;
  std::cerr << pgi.operator () <0> (t) << std::endl;
#else
  std::string data("point0 = 9000 100500\n");
  std::string::const_iterator walker = data.begin();
  std::string::const_iterator end = data.end();
  bool result = true;
  TpPointsTempStorage tpPointsTempStorage;
  TpPointsParser<std::string::const_iterator> tpPointsParser;
  while((walker != end) && (result == true))
  {
    result = qi::phrase_parse(walker,end,tpPointsParser,qi::space,tpPointsTempStorage);
    std::cerr << std::endl;
  }
  std::cerr << "tpPointsTempStorage.size() = " \
            << tpPointsTempStorage.size()      \
            << std::endl;
#endif//USE_IT
  return 0;
}
one_more_hokum
()

[C++ stl iterators] Прямой и обратный stl-совместимые итераторы для «самодельного» контейнера

Для некоего класса требуется создать stl-совместимые итераторы. Как правильнее будет сделать с точки зрения дизайна: отдельные классы для UserIterator и ReverseUserIterator, или сделать один класс итератора с тегом в конструкторе (например), на основании которого будет выбираться поведение?

one_more_hokum
()

[Да, это Flash] Утубе издеваются?

Скажите, у меня галлюцинации, или действительно на месте удалённого видео лежит слово хуяк?

one_more_hokum
()

[Qt,Windows,Creator plugins] Проблема при сборке проекта.

В QtDesigner-е помимо своих widget-ов есть возможность добавлять и рукописные. И даже есть примеры в документации, как их изготавливать. Класс, который обеспечивает регистрацию рукодельного widget-а, наследует интерфейс QDesignerCustomWidgetInterface. В этом интерфейсе есть функция includeFile, которая, как я понял, должна возвращать строку с заголовочным файлом рукодельного widget-а. В примере (Custom Widget Plugin) возвращается только имя файла, без никто:

QString AnalogClockPlugin::includeFile() const
{
 return "analogclock.h";
}
и такой вариант не работает. При попытке собрать приложение с формой, на которой лежат эти часы, конпелятор говорит, что analogclock.h не найден. Хорошо, я явно указал, откуда можно его забрать:
QString AnalogClockPlugin::includeFile() const
{
 return "<../examples/designer/customwidgetplugin/analogclock.h>";
}
Компиляция проходит успешно, но при линковке оказывается, что функции widget-а, лежащего на форме QtDesigner-а задекорированы (undefined reference to `_imp___ZN9AnalogClockC1EP7QWidget), и линковка проваливается.

Что и где я делаю неправильно, кроме того, что использую Qt?

one_more_hokum
()

[Qt::QString,boost::spirit::qi,утро понедельника] Корректность совместного использования

Для разбора конфигурационной строки в Qt-шной программе используется парсер Spirit::Qi. Используется таким образом:

QString value = ... ;// Строка, которую надо разобрать
std::string::const_iterator walker = value.toStdString().begin();// Итератор_1
std::string::const_iterator end = value.toStdString().end();// Итератор_2
parse_data(walker,end,...);// Функция разбора строки

Вопрос в том, насколько корректным будет использование Итератор_1 и Итератор_2. QString::toStdString() каждый раз возвращает временный объект std::string, а я от него беру итератор, и использую в дальнейшем. Оно-то, вроде, работает, но будет ли работать всегда?

one_more_hokum
()

[ЖЖ,идиотизма тред] Шоколад

Вот уже не первый раз, разворачивая купленную плитку шоколада вижу, что она завёрнута в две бумажки. Но ни разу, заметьте, !НИ РАЗУ! не было такого, чтобы в одной бумажке лежали ДВЕ плитки шоколада. Грустно мне от несправедливости такой.

one_more_hokum
()

[C++,protected inheritance,тупняк] Преобразование к базовому классу не удаётся

При компиляции этого чудовищно сложного кода возникает ошибка: error: 'Base' is an inaccessible base of 'Derived'

#include <iostream>
//-------------------------------------------------------------------------
struct Base
{
};
//-------------------------------------------------------------------------
struct Derived : protected Base
{
 operator Base* ()
 { return static_cast<Base*>(this); }
 Derived* operator & ()
 { return this; }
};
//-------------------------------------------------------------------------
int main(int argc,char** argv)
{
 Derived derived;
 Base* pbase = static_cast<Base*>(&derived);
 return 0;
}
Но если сделать следующий идиотизм:
struct Derived : protected Base
{
 Derived& operator & ()
 { return *this; }
};
то ошибки чудесным образом не станет. Разумеется, корректно работать всё это не будет. Какой оператор/функцию нужно выставить в public, чтобы первоначальный вариант собирался?

one_more_hokum
()

[C++,ADT] Можно ли считать boost::fusion::vector<Type0,...> алгебраическим типом данных?

Собссно, subj.

one_more_hokum
()

RSS подписка на новые темы