Ответы пользователя по тегу MinGW
  • Почему #pragma comment (lib) не обрабатывается?

    @Mercury13
    Программист на «си с крестами» и не только
    Судя по украшению __imp и расширеню *.o, вы прагму для VS применяете на MinGW. Поскольку я не знаю, на какой вы системе программирования, заходите в настройки проекта и подключаете билиотеку ws2_32.
    Ответ написан
    Комментировать
  • Отказала библиотека ODBC/Win32, какой пакет MSYS откатить?

    @Mercury13 Автор вопроса
    Программист на «си с крестами» и не только
    Неверный, но очень интересный механизм спрячу под спойлер.
    Повторяю, это неверно!
    1. *.dll → *.def

    c:\msys64\mingw32\bin\gendef.exe odbc32.dll

    2. *.def → *.a

    c:\msys64\mingw32\bin\dlltool.exe --dllname odbc32.dll --input-def odbc32.def --output-lib libodbc32_merc.a

    win32-g++: {
        contains(QMAKE_HOST.arch, x86_64):{
            # x64
            LIBS += -lodbc32
        } else {
            LIBS += -lodbc32_merc
        }
    }


    А что надо — вытащить из MinGW ODBC для Windows (c:\msys64\mingw32\i686-w64-mingw32\include\) и подкорректировать #include, чтобы брало из текущего каталога, а не из стандартного.
    // SqlUnglitch.h
    #ifdef _WIN32
      #include "SqlWin/sql.h"
      #include "SqlWin/sqlext.h"
    #else
      #include <sql.h>
      #include <sqlext.h>
    #endif

    Причина: в MSYS появилась своя библиотека ODBC с блэкджеком и шлюхами. Под Win64 по соглашениям вызова совпало, а под Win32 — нет. Почему-то при -O0 как-то работает, а уже при -O1 — уже нет.
    Ответ написан
    Комментировать
  • Насколько работает линкер GOLD в MinGW и почему Invalid character?

    @Mercury13 Автор вопроса
    Программист на «си с крестами» и не только
    В 2021 используйте LLD.
    Ответ написан
    Комментировать
  • Qt + MinGW + LTO + LLD: как заставить их работать вместе?

    @Mercury13 Автор вопроса
    Программист на «си с крестами» и не только
    К сожалению, я прошу невозможное. И связано это с архитектурой оптимизации при линковке GCC. Дело в том, что сам LD вызывает оптимизатор, и очень, блин, жаль. Ведь у LLVM другое устройство виртуальной машины, которая делает оптимизацию при линковке.
    Ответ написан
    Комментировать
  • Какой набор опций оптимизации в MinGW даёт быструю линковку и отсутствие «optimized out»?

    @Mercury13 Автор вопроса
    Программист на «си с крестами» и не только
    Сейчас куда лучше для отладки использовать линкер LLD. Он В ДЕСЯТКИ раз быстрее, чем LD.
    Разумеется, настройки компиляции надо ставить в «самое отлаживаемое» -O0.
    Я так и не понял, как ставить иконку и что с LTO — потому выпуск идёт всё ещё через LD.

    UPD 2022. А сейчас LD достаточно крут и ничего не нужно!
    Ответ написан
    Комментировать
  • Какую оптимизацию отключить в g++ -O1, чтобы не было [optimized out]?

    @Mercury13 Автор вопроса
    Программист на «си с крестами» и не только
    -fno-tree-* (в общем, все, начинающиеся на tree и входящие в O1).
    Дальше выделять бессмысленно, каждая из них делает что-то маленькое.

    Но не включаем -fno-tree-copy-prop, оно выводит адову кучу ложных тревог.

    UPD. В настоящее время лучше использовать линкер LLD, и точка. Проект разросся, а линковка длится «целых» ДВЕ секунды.
    Ответ написан
    Комментировать
  • Как исправить ошибку при компиляции файла.c в MinGW?

    @Mercury13
    Программист на «си с крестами» и не только
    Вот и положите этот libmingwex-0.dll в каталог с программой. Всё в порядке, программа скомпилировалась, остаётся пустить.
    Если такое случается при запуске компилятора — что-то с компилятором, и переустановить надо ЕГО.
    (Покопался по интернету, завтра проверю на работе свежие версии MinGW)
    Ответ написан
    Комментировать
  • Как скомпилировать QWT готовым Qt 5.10 MinGW-w64 Dynamic?

    @Mercury13 Автор вопроса
    Программист на «си с крестами» и не только
    Например, можно скомпилировать прямо через Qt Creator.
    Ответ написан
    Комментировать
  • MinGW: что за префикс _imp__ и как избавиться от него?

    @Mercury13 Автор вопроса
    Программист на «си с крестами» и не только
    Опять приходится отвечать самому. У меня три ошибки.
    Раз.
    //#define ZIP_EXTERN __declspec(dllimport)
    #define ZIP_EXTERN
    Очевидно, libzip рассчитана только на компиляцию в DLL, и точка.

    Два. -lz. Ну, это понятно, и эта библиотека в нашем дистрибутиве MinGW есть.

    Три — не до конца дописал Юникод.
    Ответ написан
    Комментировать
  • Разработка под Windows - MSVC или TDM GCC (MinGW)?

    @Mercury13
    Программист на «си с крестами» и не только
    3) Использование инициализации списком для структур (POD) с уже прединициализированными полями:

    Это C++11. Хорошее дело. MinGW поддерживал, пока стандарт ещё вырабатывался. MSVC начал было, да бросил и довёл до конца аж в 2015!!

    1) Разное содержимое одних и тех же хедеров

    Не выбивается из стандарта.

    2) MSVC спокойно компилирует нечто вроде

    MSVC ошибается, таким образом неконстантную ссылку передавать запрещено.

    но при этом не компилирует код, если не-void функция не возвращает значение

    Хорошая диагностика, но это лишь warning, а не error. Компилятору трудно знать, возможен ли тот или иной путь исполнения кода.
    Ответ написан
    Комментировать
  • Как добавить динамическую библиотеку в проект напрямую?

    @Mercury13
    Программист на «си с крестами» и не только
    Задача lib — указать если не код функций, то хотя бы каким образом их прилинковывать из DLL. В частности, как «искозявлено» имя функции при переводе с Си на Си++. Этот самый lib — издержка разделения функций между компилятором и линкером.
    Не знаю, как MSVS/cl, но MinGW/ld с определённого момента начал прилинковывать DLL просто по наличию этого DLL, без построения *.a (а Embarcadero/ilink32, насколько мне известно, умел это изначально). С одной стороны, это серьёзно упрощает жизнь. С другой — для некоторых хитрых способов преобразования имён (или даже без имён, как в небезызвестном storm.dll) он не выцепит, что с чем слинковывать, *.a всё равно потребуется.
    stackoverflow.com/questions/31708832/how-to-refere...
    www.codeproject.com/Questions/613668/Is-it-possibl...
    Простейший, действующий на любом компиляторе способ — это сделать DLL-заглушку со всеми нужными нам функциями в нужных нам соглашениях вызова и с нужным образом закозявленными именами. Код может быть любым, хоть пустым. Компилируем, подставляем этот lib и правильный DLL.
    Второй способ — получить список имён функций, собрать их в *.def с правильными соответствиями «имя в коде — имя в DLL» и сделать из этого *.lib. Какими программами это делается в MSVS — описано по одной из ссылок.
    Ответ написан
    2 комментария
  • Как поймать в GDB исключение, вызванное из basic_string(const charT*)?

    @Mercury13 Автор вопроса
    Программист на «си с крестами» и не только
    Нашёл.
    Подключить статический libc++ (-static-libstdc++), тогда всё будет.
    Ответ написан
    Комментировать