SFML教程1:线程问题

时间:2011-06-07 03:12:10

标签: multithreading sfml

您好我正在使用msVS ++ 2010并且一直在尝试设置SFML .... 我下载了1.6从网站,然后重建它在VS2010,却悲哀地发现,这并不会导致SFML系统-d.lib文件,这是我所习惯使用仅生产新系统-S和system-sd libs。

然后我密切关注这个Video,发现他通过添加sfml-system-sd的外部库来运行他的测试代码,所以我在.exe后添加了sfml-system-d.dll并得到了视频显示以下完全相同的代码:

#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-s-d.lib文件的额外依赖。
  • 出于frusteration我将每个dll文件放在.exe
  • 旁边

1 个答案:

答案 0 :(得分:2)

在构建SFML 时,您可能不会链接到CRT。 (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。 或者,如果它没有'链接器'去 进入Properties -> Configuration -> Librarian

  2. 将“忽略默认库”设置为 “不”,它可能会起作用

  3. 如果您想要100%安全,请单击其他依赖项,展开它,然后单击“编辑”。现在只需粘贴上面的库

  4. 如果您在“图书管理员”标签中,请设置 链接库依赖关系为是

  5. 每次重复步骤1-4 更改Debug的构建设置 DLL,Debug static等

  6. 当我重新编译SFML(授予时,我有一个静态编译,因为1.6是1.x行的最后一行,而2.0不兼容;))我不得不添加这些引用。它将忽略(并“警告”忽略)它不需要的任何东西,但它们是默认值;)

    不幸的是,您需要更新SFML解决方案中的所有内容,因为如果我没记错的话,它们都缺少默认库。