В динамической библиотеке sfml-graphics-2 не удалось найти точку входа процедуры zst24 throw out of range fmtPKcz.файл DLL

сегодня я решил загрузить, установить и попытаться использовать SFML 2.2. Я также загрузил Code:: Blocks с компилятором MinGW. Я настроил все и установил все правильно (или так я думал) и попытался запустить пример кода, чтобы увидеть, будет ли он работать:

#include <SFML/Graphics.hpp>

int main()
{
    sf::RenderWindow window(sf::VideoMode(200, 200), "SFML works!");
    sf::CircleShape shape(100.f);
    shape.setFillColor(sf::Color::Green);

    while (window.isOpen())
    {
        sf::Event event;
        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
                window.close();
        }

        window.clear();
        window.draw(shape);
        window.display();
    }

    return 0;
}

код скомпилирован правильно, хотя при попытке запустить его появляется сообщение об ошибке " точка входа процедуры _ZSt24_ _ throw_out_of _ range_fmtPKcz не может быть расположена в динамической библиотеке ссылок sfml-графика-2.файл DLL." Я искал в интернете, но не нашел ничего, связанного с этой проблемой, поэтому я пришел сюда в поисках помощи. Благодаря дальнейшим ответам.

3 ответов


основная причина этой проблемы заключается в том, что библиотеки импорта для DLL были созданы для другой версии DLL, которую вы используете.

когда вы создали приложение, вы использовали библиотеку импорта, чтобы компоновщик нашел функции SFML, которые вызывает ваше приложение. Однако сама библиотека DLL не содержит одну или несколько функций, для которых библиотека импорта имеет заглушки.

при создании приложения, которое неявно загружает DLL, влечет за собой 3 этапа:

  1. компиляция кода
  2. связывание кода
  3. запуск кода

все, что заботит компилятор, это то, что программа синтаксически правильна. Это сработало без ошибок.

этап компоновщика определяет, действительно ли существуют вызываемые функции. Здесь все становится сложным, так как заглушки функций существуют в библиотеке импорта, и это удовлетворит компоновщик. Библиотека импорта сообщает линкер: "да, эта функция находится здесь, в этой DLL, поэтому поверьте мне". Это также сработало без ошибок для вас

(обратите внимание, что это отличается в сценарии без DLL, где компоновщик фактически будет искать саму функцию, а не заглушку).

однако сами фактические функции находятся в другом модуле (DLL), и единственное время, когда ваше приложение может определить их существование, - это когда вы запускаете программу. Вот где ты застрял. сейчас.

поэтому сначала вы должны убедиться, что библиотеки импорта, которые вы используете при создании приложения, соответствуют DLL, которые вы загружаете во время выполнения. Если вы все еще получаете ошибку, свяжитесь с тем, где вы получили DLL и спросите, как получить правильные библиотеки импорта.

кроме того, есть способы создать библиотеку импорта из библиотеки DLL, если по какой-то причине вы не можете получить библиотеки импорта. Я не знаю всех подробностей, как это сделать вручную для MingW, но информация должна быть доступна где-то в интернете.


это не прямое решение, но обходным путем было бы попробовать статическую привязку. Похоже, что учебник SFML говорит об этом, и он включает в себя добавление SFML_STATIC на . Ваши exe будут больше, но они также будут более независимыми.

у меня была такая же проблема, и статическая связь работала, хотя я использовал mingw-w64 i686 вместе с cmake. Вы бы загрузить исходный код SFML, а затем в настройках cmake, вы бы:

  • выбрать исходные и встроенные папки
  • нажмите "Настроить" и для генератора выберите "CodeBlocks-MinGW Makefiles"
  • выключить BUILD_SHARED_LIBS
  • поворот на SFML_BUILD_EXAMPLES и SFML_USE_STATIC_STD_LIBS
  • изменить CMAKE_BUILD_TYPE для отладки (необязательно, для полезных сообщений об ошибках)
  • нажмите "Настроить", затем "создать"

будет .cbp-файл в папке сборки. Кроме того, примеры могут сообщить вам либо папку "ресурсы", либо openal32.dll отсутствуют, поэтому вам просто нужно добавить их в примеры в папке сборки.


по сути, это говорит о том, что ваш компилятор отличается от того, который использовал SFML.

вы можете решить эту проблему, загрузив конкретную версию для каждого. Для CodeBlocks, вы просто скачать(mingw16.01): http://www.codeblocks.org/downloads/26

для SFML, вы просто скачать GCC 4.9.2 TDM (SJLJ): https://www.sfml-dev.org/download/sfml/2.4.2/