Задать вопрос
  • Как исправить ошибку линкера?

    @Ariox41
    Евгений Шатунов: Возможно, вам изначально следовало поинтересоваться, обязательна ли эта строка? Строка не обязательна, без неё ничего не изменится. Но слово default при объявлении функции изначально носит функцию документирования (наряду с другими), и означает, что будет использовано решение по умолчанию (в случае специальных функций, тело генерируется автоматически). Поскольку это основы языка, я не посчитал нужным уточнять это, тем более что значение слова default совпадает с последствиями его применения. Стоящий рядом комментарий относится к деструктору, а не к к слову default.
  • Как исправить ошибку линкера?

    @Ariox41
    Евгений Шатунов: Слово default никак не связано со словами "генерируется автоматически благодаря умным указателям". Это всего лишь означает, что используется деструктор по умолчанию, что описывается в стандарте.
    А вот деструктор по умолчанию уже генерируется в соответствии с правилом "вызвать деструкторы для всех членов класса" (+ еще указывается порядок вызова и учитывается наследование, но сейчас это не важно). Вывод специальных функций-членов (к которым относится деструктор) описывается в этом разделе, а также в любом учебнике по C++ для начинающих.

    Умные указатели являются одним из типичных случаев использования RAII, вторым типичным случаем являются стражи для мьютексов (эти примеры приводятся по ссылке, которую я уже давал: RAII. Где-то в стандарте это тоже упоминается, но мне лень искать.
  • Как исправить ошибку линкера?

    @Ariox41
    Евгений Шатунов: Про управление ресурсами читайте Майерса. Или читайте про RAII, например, тут.

    Деструктор не может быть не объявлен, он всегда генерируется автоматически, если не объявлен вручную. Проблема в том, что деструктор по умолчанию просто вызывает деструкторы, составляющие класс объектов (не delete для объекта, а сам деструктор). В случае встроенных типов, в том числе, указателей, по сути не происходит ничего (т.е. динамически выделенная память не освобождается). Умные указатели в своём деструкторе освобождают память, если она была выделена (unique_ptr). Кроме того, можно использовать пользовательский удалитель для unique_ptr, чтобы добавить дополнительные действия (например, мьютекс можно освободить, поток подождать (wait) или отпустить (detach)).
  • Как исправить ошибку линкера?

    @Ariox41
    Павел Каптур: На C++98 есть auto_ptr. Или можно вообще не использовать указатели. В любом случае, смысл там в том, что когда в теле класса несколько указателей/дескрипторов, высок шанс утечки ресурсов, когда часть ресурсов уже создана, а часть - нет. Умные указатели позволяют решить проблему, т.к. автоматически освобождают ресурс, если он выделен, и не освобождают, если нет.
    Если у вас создан хоть какой-то деструктор, но компоновщик его не видит, значит вы не подключили библиотеку с этим деструктором. У вас скорее всего есть main.cpp и module_class.cpp, их оба нужно скомпилировать, а затем собрать компоновщиком получившиеся *.o файлы в исполняемый файл. Обычно для этого используют системы автоматизации сборки типа CMAKE.
  • Как подключить библиотеку boost для Android в Qt?

    @Ariox41
    Ася: Судя по этому ответу, проблема тут более глубокая, и она не связана с boost. Тут я ничем помочь не могу, нужно разбираться с линкером и, возможно, пересобирать Qt с другими флагами. Можно попробовать для начала сменить версию компилятора, для этого в настройках сборки Qt нужно добавить новый комплект, в котором указать нужный компилятор (если он не найден автоматически, нужно найти путь к нему вручную). QtCreator скорее всего при этом подставит неверной имя компилятора при запуске qmake, из-за чего нужно явно указывать его в .pro, у меня это выглядит так: QMAKE_CXX = i686-linux-android-gcc-5.3
  • Как подключить библиотеку boost для Android в Qt?

    @Ariox41
    Ася: я пару дней назад пытался настроить сборку для android под windows, у меня возникла другая проблема: qmake не экранирует пути, из-за чего на этапе установки (перед запаковкой в apk) mingw32-make вызывал команду copy с ошибочным синтаксисом (под linux дефисы не нужно экранировать, но cmd дефисы считает ошибкой синтаксиса). Судя по всему, это от версии qmake зависит.
    У вас, кстати, в этом месте тоже какое-то сообщение от mingw32-make появляется в кривой кодировке. Чтобы прочитать его, рекомендую запустить qtcreator следующим скриптом:
    @echo off
    reg add "HKCU\Software\Microsoft\Command Processor" /v AutoRun /t reg_expand_sz /d "chcp 1251 1>nul" /f
    qtcreator.exe
    reg delete "HKCU\Software\Microsoft\Command Processor" /v AutoRun /f

    (подробнее)

    Ну и на всякий случай,
    мой .pro файл
    QT       += core gui
    
    greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
    
    TEMPLATE = app
    
    CONFIG += c++14
    CONFIG -= debug_and_release debug_and_release_target
    
    DEFINES += QT_DEPRECATED_WARNINGS
    
    SOURCES += main.cpp\
            mainwindow.cpp
    
    HEADERS  += mainwindow.h
    
    FORMS    +=
    TEMPLATE = app
    CONFIG += mobility
    MOBILITY =
    
    LIBS += \
        -L"D:/Development/android/crystax-ndk-10.3.2/sources/boost/1.59.0/libs/x86/gnu-4.9/" -lboost_regex \
        -L"D:/Development/android/crystax-ndk-10.3.2/sources/crystax/libs/x86" -lcrystax
    
    INCLUDEPATH += "D:/Development/android/crystax-ndk-10.3.2/sources/boost/1.59.0/include"
    DEPENDPATH += "D:/Development/android/crystax-ndk-10.3.2/sources/boost/1.59.0/include"
    
    ANDROID_EXTRA_LIBS += \ 
        "D:/Development/android/crystax-ndk-10.3.2/sources/boost/1.59.0/libs/x86/gnu-4.9/libboost_regex.so" \
        "D:/Development/android/crystax-ndk-10.3.2/sources/crystax/libs/x86/libcrystax.so"
  • Как подключить библиотеку boost для Android в Qt?

    @Ariox41
    Ася: Для начала, определитесь, какой тип связывания вы используете: динамический, или статический. Часть библиотек можно подключать динамически, часть - статически, но конкретную библиотеку нужно подключать однократно, одним из способов, иначе могут возникнуть проблемы.

    Сообщение об ошибке означает, что не найден конструктор класса std::__cxx11::string (который заменяет std::string в c++11), на который ссылается libboost_regex.so. Не знаю, почему это произошло, возможно, какая-то несовместимость. Возможно, проблему решит статическое связывание с boost.
  • Как подключить библиотеку boost для Android в Qt?

    @Ariox41
    Ася: Тут возможно много вариантов, но наиболее вероятно, что какие-то ресурсы не были запакованы в apk. В частности, я не вижу, что бы либы из boost запаковывались. Тут (в конце страницы) я нашел упоминание переменных, которые могут решить проблему.

    В частности, как и в исходном варианте, можно прописать полные пути в ANDROID_EXTRA_LIBS:
    ANDROID_EXTRA_LIBS = \
            C:/qt_projects/-----X-----/boost/1.59.0/libs/x86/gnu-5/libboost_regex.so \
            C:/qt_projects/-----X-----/boost/1.59.0/libs/x86/gnu-5/libboost_system.so


    Но это не заменяет переменную LIBS, LIBS используется для сборки, ANDROID_EXTRA_LIBS и подобные - для запаковывания в apk.

    Еще вариант, можно статически линковать boost (Правой кнопкой на проекте - добавить статическую библиотеку). Тогда LIBS заменится на PRE_TARGETS, или что-то вроде того.
  • Как подключить библиотеку boost для Android в Qt?

    @Ariox41
    Ася:
    Что касается
    External library LC:/qt_projects/-----X-----/boost/1.59.0/libs/x86/gnu-4.9/ does not exist!
    , тут опять не правильный формат LIBS. Должно быть так:
    LIBS += -L"C:/qt_projects/-----X-----/boost/1.59.0/libs/x86/gnu-4.9" -lboost_regex -lboost_system

    или
    LIBS += -L"C:/qt_projects/-----X-----/boost/1.59.0/libs/x86/gnu-4.9" libboost_regex.so libboost_system.so


    Boost, судя по всему скомпилирован для c++11 (я опечатался). Со сборкой boost проблема в том, что boost собирается собственной средой сборки boost.Build, с конфигурацией которой бывает непросто разобраться, особенно под Windows. Но если хотите попробовать, вам нужен этот раздел документации (для Unix). Там главное правильно прописать, что нужно компилировать с c++14, а не с c++11.

    Что касается той инструкции про Qt, это к вопросу установки другого компилятора. Но судя по всему, в NDK еще более старая версия (я так и не понял, какая).

    Возможно, стоит попробовать найти в CrystaX NDK компилятор g++5.3 и подключать boost из каталога gnu-5. С большой вероятностью там boost скомпилирован с std=c++14. Если у вас старая версия CrystaX NDK, для начала нужно её обновить.

    Но для начала надо попробовать просто правильно прописать пути, запустить qmake и пересобрать проект.
  • Как подключить библиотеку boost для Android в Qt?

    @Ariox41
    Обобщенные лямбды появились только в c++ 14. Boost, судя по всему, был собран с флагом -std=c++14. Можно попробовать собрать boost с поддержкой c++14 но это не просто, или можно вручную указать типы аргументов в лямбдах вместо auto. Я бы рекомендовал найти найти более свежую версию компилятора ( CrystaX NDK вроде бы предоставляет gcc-5.3). Актуальная версия gсс сейчас gсс-6.3, но с++14 более-менее нормально поддерживается уже в gсс-5.x.

    Еще можно попробовать воспользоваться этой инструкцией.

    UPD: тостер не обновляет комментарии автоматически, я опять пропустил ваш последний комментарий
  • Как подключить библиотеку boost для Android в Qt?

    @Ariox41
    Ася: Не сразу прочитал предыдущий комментарий, вам нужен gnu-4.9, версия соответствует версии компилятора (если бы был clang, тогда был бы нужен llvm, а g++ - это gnu)
  • Как подключить библиотеку boost для Android в Qt?

    @Ariox41
    Ася: Еще можно попытаться точно задавать название, может быть он не может распознать из-за того, что под Windows работает:
    LIBS += L"C:/qt_projects/-----X-----/boost/1.59.0/libs/x86/gnu-5" libboost_regex.so libboost_system.so
  • Как подключить библиотеку boost для Android в Qt?

    @Ariox41
    Ася: Судя по этой части:
    -LC:/qt_projects/-----X-----/boost/1.59.0/libs/x86/gnu-5 -lboost_system -lboost_atomic -LC:/qt_projects/-----X-----/IsTextRankKo-master/src/../../boost/1.59.0/libs/x86/gnu-5/ -lboost_regex
    , компилятор получает правильные аргументы, только у вас сейчас путь к либам два раза указывается (из-за последнего добавления, видимо). Вызывает некоторые сомнения сочетание "gnu-5" и GCC 4.9. Возможно, у вас версия компилятора не соответствует той, которой был boost скомпилирован.
  • Как подключить библиотеку boost для Android в Qt?

    @Ariox41
    Ася: Тут нужно смотреть вывод линковщика (консоль сборки), там нужно искать "boost_regex", и в каком виде он передается
  • Как подключить библиотеку boost для Android в Qt?

    @Ariox41
    Ася: Извиняюсь, опять ошибся. Перед l и L нужно ставить -
    LIBS += -L"C:/qt_projects/-----X-----/boost/1.59.0/libs" -lboost_regex -lboost_system

    Почему то я думал, что не нужно.
  • Как подключить библиотеку boost для Android в Qt?

    @Ariox41
    Ася: qmake автоматически подставляет префикс lib и суффикс so (хотя с lib могут быть проблемы).
    По идее, правильный вариант
    LIBS += L"C:/qt_projects/-----X-----/boost/1.59.0/libs" lboost_regex lboost_system

    Как вариант, можно попробовать указать абсолютный путь к каждой библиотеке:
    LIBS += "C:/qt_projects/-----X-----/boost/1.59.0/libs/libboost_regex.so" \
                 "C:/qt_projects/-----X-----/boost/1.59.0/libs/libboost_system.so"

    Еще вариант, в QtCreator можно кликнуть на проекте (или подпроекте) правой кнопкой, выбрать "добавить библиотеку" -> внешняя -> динамическая, там указать путь.
  • Как подключить библиотеку boost для Android в Qt?

    @Ariox41
    Ася: Судя по всему, я немного ошибся в ответе. В qmake переменная LIBS имеет формат
    L"Путь к какталогу" lназвание_библиотеки1 lназвание_библиотеки2
    . Соответственно, для подключения boost::regex вам нужно написать
    LIBS += L"C:/qt_projects/-----X-----/boost/1.59.0/libs" lboost_regex lboost_system
    .
    Возможны варианты, например
    LIBS += L"C:\qt_projects\-----X-----\boost\1.59.0\libs" lboost_regex lboost_system
    или
    LIBS += L"/с/qt_projects/-----X-----/boost/1.59.0/libs" lboost_regex lboost_system
    .
    Изначально я предполагал, что contains(ANDROID_TARGET_ARCH,x86) {...} для этого и нужен, но судя по всему это не так.
  • Какую литературу по изучению С(не С++) и IDE посоветуете и почему С++ популярней С?

    @Ariox41
    Толстый Лорри: другие аргументы были бы субъективны, тут надо самому пробовать.
  • Какую литературу по изучению С(не С++) и IDE посоветуете и почему С++ популярней С?

    @Ariox41
    Ivan Sokolov: действительн, перед сном не вчитался в вопрос. Но большая часть ответа от этого не меняется, только cplusplus.com нет смысла смотреть. На cppreference естьть и про чистый C. Под мощной системой типов я понимаю шаблоны и связанные с ними вещи, constexpr, например.
  • Созданный проект не запускается на других компьютерах. Что делать?

    @Ariox41
    Adamos: Насколько я помню, dev c++ использует MinGW, а Visual Studio на данные момент проблематично установить без установки среды разработки (которая ставится около часа и много весит). А так да, нужно правильно настроить проект и среду разработки.