Не удается открыть входной файл sfml graphics lib

Обновлено: 07.07.2024

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

основная причина этой проблемы заключается в том, что библиотеки импорта для 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, вы бы:

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

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

В этом уроке я хотел бы показать, как подключить библиотеку SFML к среде разработки Visual Studio.

SFML содержит ряд модулей для простого программирования игр и мультимедиа приложений.


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

Запускаем Visual Studio, файл->создать->проект->пустой проект. (Имя проекта, решений и путь выбирайте сами).


Добавляем исходный код – для этого слева в обозревателе решений находим вкладку «Файлы исходного кода»->правый клик->добавить->создать элемент->файл C++ (имя main.cpp)->добавить.

Далее вставляем вот этот тестовый код в файл main.cpp

После попытки запуска мы сталкиваемся с подобной проблемой:


Для того, чтобы всё это работало – необходимо подключить библиотеку SFML.

Для начала, все действия мы делаем для конфигурации Debug.

Заходим вверху «проект»->свойства “имя проекта”->свойства конфигурации->C++->общие

В пункте «дополнительные каталоги включаемых файлов прописываем путь до раннее распакованного архива с библиотекой (+ \include.)

Например: C:\Program Files\SFML-2.3.2\include


Затем идем в компоновщик->общие и в пункте «дополнительные каталоги библиотек» прописываем путь к папке lib;


Далее идем в компоновщике во вкладку ввод и в первой строке «дополнительные зависимости» вписываем перед всеми библиотеками следующую строчку:

sfml-graphics-d.lib;sfml-window-d.lib;sfml-system-d.lib;sfml-audio-d.lib;


Только что подключили основные необходимые для работы библиотеки.

Последний штрих – идем во вкладку C++->препроцессор и в первой строке «определение препроцессора» в самом начале дописываем: SFML_DYNAMIC;


Напоминаю, все действия мы делали для конфигурации Debug. Все тоже самое нужно проделать для конфигурации Release.
Заходим вверху «проект»->свойства “имя проекта”->свойства конфигурации. В левом верхнем углу находим Конфигурация, нажимаем на слайдер и выбираем Release.
И повторяем несколько предыдущих пунктов.






Запустим и словим ошибку. Зато соберется проект и появится папка debug.

Теперь идем в папку бинарников “bin”, которую вы скачали и распаковали с библиотекой (мой вариант D:\SFML-2.2\bin\) и копируем всё содержимое этой папки (dll файлы типа sfml-graphics-2.dll) в папку с вашим проектом в папку debug (после сборки появилась эта папка), но не в тот debug, где лежит файл с исходным кодом “main.cpp”, а тот, где появляется exe файл.

В эту же папку копируем и вот эти файлы :

Все эти файлы можно скачать в zip архиве, который я прикрепил снизу.

Теперь проект можно запустить и если вы всё сделали правильно, то увидите зелёный круг как на скриншоте ниже:

Пссс, парень! Не хочешь попробовать немного SFML? Убойная штука. Достаточно самой малости и с её помощью ты сможешь воплотить в жизнь то, о чем раньше мог только мечтать. Тебе понравится, гарантирую. Тем более тебе, как новичку, первая порция бесплатно, я угощаю. Ну что, договорились? Тогда по рукам.

Что такое SFML?

С её помощью можно легко и непринужденно создавать любую 2D-графику: начиная от простейших одиночных геометрических фигур (типа треугольника) и заканчивая полноценными играми-платформерами.

Примечание: Все примеры этого урока были сделаны мной в ОС Windows 7 с использованием IDE MS Visual Studio 2017 Community Edition и библиотеки SFML 2.5.1.

Ну что, парень, ты готов? Да вижу, что готов. Погнали!

Установка библиотеки SFML в Visual Studio


Как уже говорилось ранее, в качестве IDE я буду использовать Visual Studio 2017, поэтому скачиваем соответствующую версию SFML. Вы также можете заметить наличие готового пакета для эстетов Code Blocks. Помимо этого, в глаза бросаются варианты библиотеки для других версий Visual Studio. Сразу дам совет — не пытайтесь лепить Франкенштейна, используя неподходящий билд SFML, иначе вы рискуете получить вагон и маленькую тележку всякого рода проблем на свою голову.


Теперь скачанный архив нужно распаковать. У себя я выбрал следующий путь — C:\Soft\SFML-2.5.1-windows-vc15-32-bit .

Далее создадим пустой проект и подключим к нему библиотеку SFML. Для этого запустите Visual Studio и выберите "Файл" > "Создать" > "Проект…" , или можно воспользоваться сочетанием горячих клавиш Ctrl+Shift+N . Задайте имя и расположение проекта так, как показано на следующем скриншоте:


Теперь, когда у нас есть проект, нужно добавить в него файл, который будет содержать исходный код нашей программы. Для этого в окне «Обозреватель решений» клацните ПКМ по строке "Исходные файлы" > "Добавить" > "Создать элемент…" :


В поле «Имя» укажите main.cpp :


Отлично! Следующим шагом будет подключение библиотеки SFML к нашему проекту. Для этого нужно:

подключить каталог заголовочных и исходных файлов SFML ( /include );

подключить каталог библиотечных файлов SFML ( /lib );

подключить библиотечные файлы SFML в качестве дополнительных зависимостей.

Переходим в "Проект" > "Свойства: SFML_Tutorial…" :


В верхнем левом углу страницы свойств SFML_Tutorial есть выпадающий список возле пункта "Конфигурация" , установите его значение как "Все конфигурации" . Также проверьте, что в параметре "Платформа" установлено значение "Win32" . Затем в левой части окна найдите и выберите раздел "Свойства конфигурации" > "С/С++" > "Общие" . Обратите внимание на правую часть, нас интересует параметр "Дополнительные каталоги включаемых файлов" . Выберите его и нажмите <Изменить…> . Перед вами появится новое окно, в котором нужно указать путь к заголовочным файлам библиотеки SFML. Обычно они располагаются в папке include. У меня этот путь выглядит как C:\Soft\SFML-2.5.1-windows-vc15-32-bit\SFML-2.5.1\include .


Похожим образом подключаются и файлы библиотек. Всё, что нужно сделать — это выбрать в левой части "Свойства конфигурации" > "Компоновщик" > "Общие" . Затем "Дополнительные каталоги библиотек" и <Изменить…> . В открывшемся окне нужно будет указать путь к библиотечным файлам SFML, у меня это C:\Soft\SFML-2.5.1-windows-vc15-32-bit\SFML-2.5.1\lib .


Осталось подключить несколько файлов в виде дополнительных зависимостей для «Компоновщика». Для этого нужно переключить тип конфигурации на Debug , а затем в левой части окна выбрать "Свойства конфигурации" > "Компоновщик" > "Ввод" . Переведите взгляд на правую часть, где нужно найти строку "Дополнительные зависимости" и нажмите <Изменить…> . В появившемся окне впишите имена следующих 4 файлов:

sfml-graphics-d.lib
sfml-window-d.lib
sfml-audio-d.lib
sfml-system-d.lib

Должно получиться следующее:

Первые шаги и первые…

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

// Объект, который, собственно, является главным окном приложения RenderWindow window ( VideoMode ( 200 , 200 ) , "SFML Works!" ) ; // Главный цикл приложения. Выполняется, пока открыто окно // Пользователь нажал на «крестик» и хочет закрыть окно?

Я вижу, как ваша рука уже потянулась к кнопке «Скомпилировать и запустить проект», но не торопитесь, давайте сначала разберем данный код:

Строка №3: Подключаем пространство имен sf .

Строка №8: Создаем объект window класса RenderWindow. Данный объект — это наше окно, в котором будет отображаться 2D-графика. Первый параметр VideoMode(200, 200) задает видеоразрешение окна (ширину и высоту). Второй параметр "SFML Works!" — это заголовок окна.

В строке №23 мы вызываем метод display(), который отвечает за отрисовку нашего окна.

Вот теперь можно перейти к компиляции и первому запуску программы. Для этого нажмите в Visual Studio "Отладка" > "Запуск без отладки" (или Ctrl+F5 ). Ииии, вот и она! Ваша первая… ЧТО…. ОШИБКА…. WTF….


А проблема в том, что исполняемый файл нашей программы не может найти *.dll-файлы, в которых хранятся используемые нашим приложением функции. Решение очень простое — нужно скопировать все файлы (11 штук) из папки C:\Soft\SFML-2.5.1-windows-vc15-32-bit\SFML-2.5.1\bin\ в папку C:\dev\SFML_Tutorial\Debug\ , в которой хранится наш исполняемый файл SFML_Tutorial.exe:


Попробуйте теперь скомпилировать и запустить проект. В результате должно получиться следующее:

SFML - это библиотека для языка C++, обеспечивающая простые средства создания окна, двумерного рисования, работы с сетью и с операционной системой. Она работает на Windows, Linux и Mac OS X. В статье мы покажем, как подключить SFML к проекту в Visual Studio.

Содержание

скриншот

После скачивания нас ожидает ещё несколько шагов для подключения SFML к приложению:

  • обеспечить поиск заголовочных файлов *.h препроцессором C++
  • обеспечить поиск библиотек *.lib ( *.a ) компоновщиком C++
  • перечислить библиотеки *.lib ( *.a ), используемые проектом
  • добавить динамические библиотеки *.dll ( *.so`) в пути поиска программы
  • добавить макрос SFML_DYNAMIC в настройки препроцессора

Выбор Visual Studio

Предпочтительно использовать последнюю выпущенную версию Visual Studio Community Edition, и выбирать английскую локализацию. Если вы установили другую локализацию (например, русскую), её лучше удалить и всё же поставить английскую. В противном случае появится целый ряд проблем с терминологией, поиском информации в сети и использованием статей и книг. Не секрет, что большая часть актуальной информации о программировании в сети — на английском языке, и лучше, если интерфейс среды разработки тоже будет английским.

Механизм Property Sheet

Лучше всего сделать настройки сборки легко переносимыми между разными компьютерами. Это означает, что в проекте не должно быть абсолютных путей к файлам и каталогам. Кроме того, хотелось бы упростить создание нового проекта на SFML.

Соблюсти эти требования можно с помощью Property Sheets — внешних файлов, которые система сборки MSBuild и среда Visual Studio интерпретируют при загрузке проекта *.vcxproj .

Для начала работы с Property Sheets откройте вкладку “Property Manager” вместо “Solution Explorer” в панели Visual Studio. Нужный пункт меню доступен из раздела “View”, но может находиться непосредственно в этом меню или скрываться в подменю “Other Windows”.

Скриншот

Выбранный Property Sheet можно настроить вместо настройки проекта, и внесённые изменения будут действовать для всех проектов на данной машине, но не попадут под контроль версий Git.

Скриншот

На выходе вы получите файл *.props , который представляет собой переносимые между проектами настройки сборки. В этот файл надо добавить пути к заголовочным файлам и библиотекам, как описано ниже.

Настройка путей поиска компонентов SFML

После распаковки загруженного архива с SFML в распакованном каталоге будут следующие важные для нас компоненты:

  • каталог include должен быть добавлен в пути поиска заголовочных файлов (в Visual Studio это называют include directories, на UNIX их принято называть include paths)
  • каталог lib должен быть добавлен в пути поиска линкуемых библиотек (в Visual Studio это называют library directories, на UNIX их принято называть linker search paths)

Внесённые изменения среда отображает жирным шрифтом:

скришнот

При настройке путей поиска в диалоге их редактирования не забудьте оставить включённой галочку “Inherit from parent or project settings”, чтобы случайно не сбросить стандартные пути поиска заголовков и библиотек, входящих в состав Windows API, C++ Standard Library и C Standard Library

скриншот

Настройка предопределённых макросов препроцессора

Поскольку SFML подключается нами как динамическая библиотека, нам надо не забыть объявить макрос SFML_DYNAMIC в списке предопределённых макросов (в Visual Studio они называются Preprocessor Definitions):

скриншот

Настройка шага компоновки (linking)

В настройки компоновщика (linker) в списке его входных файлов необходимо добавить

  • для Release-конфигурации: sfml-graphics.lib, sfml-window.lib, sfml-system.lib
  • для Debug-конфигурации: sfml-graphics-d.lib, sfml-window-d.lib, sfml-system-d.lib

скриншот

Копирование DLL в каталог с собранной программой

В дистрибутиве SFML каталог bin содержит разделяемые библиотеки ( *.dll ), которые следует добавить в каталог с исполняемым файлом после сборки программы.

  • Вы можете скопировать DLL вручную
  • Вы можете настроить шаг сборки, например, PreLink или PostBuild

Пример на SFML (рисование круга на экране)

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

Читайте также: