SFML-руководство 1: проблемы с потоками - PullRequest
0 голосов
/ 07 июня 2011

Привет, поэтому я использую msVS ++ 2010 и пытаюсь настроить SFML весь день .... Я скачал 1.6 с сайта, а затем перестроил его в VS2010, но грустно обнаружить, что это не привело кФайл sfml-system-d.lib, к которому я привык, и производил только новые библиотеки system-s и system-sd.

Затем я внимательно наблюдал за этим Видео , чтобыобнаружил, что он запустил свой тестовый код, добавив внешнюю библиотеку sfml-system-sd, и поэтому я добавил sfml-system-d.dll рядом с .exe и получил следующий точно такой же код, который показывало видео:

#include <iostream>
#include <SFML/System.hpp>

int main(int argc, char **argv)
{
    sf::Clock clock;

    sf::Sleep(0.1f);

    while(clock.GetElapsedTime() < 5.0f)
    {
        std::cout << clock.GetElapsedTime() << std::endl;
        sf::Sleep(0.5f);
    }
}

очевидно, что часы и сон работают, но когда я добавляю простую строку кода 'sf :: Thread thread ();'Появляется окно с сообщением «невозможно запустить программу», «Конфигурация неверна», «Проверьте файл манифеста на возможные ошибки», «Обновляете мое исправление».

Также:при попытке запустить первую программу учебных пособий о потоках:

#include <SFML/System.hpp>
#include <iostream>

void ThreadFunction(void* UserData)
{
    // Print something...
    for (int i = 0; i < 10; ++i)
        std::cout << "I'm the thread number 1" << std::endl;
}

int main()
{
    // Create a thread with our function
    sf::Thread Thread(&ThreadFunction);

    // Start it !
    Thread.Launch();

    // Print something...
    for (int i = 0; i < 10; ++i)
        std::cout << "I'm the main thread" << std::endl;

    return EXIT_SUCCESS;
}

я получаю 8 нереализованных внешних символов, таких как этот:

1>sfml-system-s-d.lib(Thread.obj) : error LNK2001: unresolved external symbol "__declspec(dllimport) public: int __thiscall std::ios_base::width(int)" (__imp_?width@ios_base@std@@QAEHH@Z)
 fatal error LNK1120: 8 unresolved externals
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

Наконец, так настроен мой проект:

  • включает каталог «из коробки», недавно загруженный каталог SFML 1.6 / include
  • lib в VS2010 перестроенный SFML (параметр DLL отладки / выпуска и статический).
  • дополнительная зависимость от файла sfml-system-sd.lib.
  • из-за разочарования я поместил каждый файл DLL рядом с .exe

1 Ответ

2 голосов
/ 08 июня 2011

Похоже, вы не можете связываться с ЭЛТ при сборке SFML .(ios_width - это iostream, для которого требуется библиотека CRT.)

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

0.скопируйте этот список библиотек

kernel32.lib
user32.lib
gdi32.lib
winspool.lib
comdlg32.lib
advapi32.lib
shell32.lib
ole32.lib
oleaut32.lib
uuid.lib
odbc32.lib
odbccp32.lib

  1. входит в каждый отдельный проектProperties -> Configuration -> Linker -> Input.или если у него нет 'Linker', перейдите в Properties -> Configuration -> Librarian.

  2. Установите для параметра «Игнорировать библиотеки по умолчанию» значение «Нет», и оно, вероятно, будет работать

  3. Если вы хотите быть на 100% безопасным, нажмите на дополнительныезависимости, разверните его и нажмите «изменить».Теперь просто вставьте в libs выше

  4. Если вы находитесь на вкладке «Библиотекарь», установите «Зависимости библиотеки ссылок» на ДА

  5. , повторите шаги 1-4 каждый раз, когда вы меняете настройки сборки Debug DLL, статической отладки и т. Д.

Когда я перекомпилирую SFML (предоставлено, у меня статическая компиляция, потому что 1.6 является последним из 1.x line и 2.0 не совместимы;)) Мне пришлось добавить эти ссылки.Он будет игнорировать (и «предупреждать» о игнорировании) все, что ему не нужно, но они являются значениями по умолчанию;)

К сожалению, вам потребуется обновить все в решении SFML, как, если я правильно помнювсе они пропускают библиотеки по умолчанию.

...