【问题标题】:SFML tutorial 1: thread problemsSFML教程1:线程问题
【发布时间】:2011-09-09 18:09:19
【问题描述】:

您好,我正在使用 msVS++2010,并且整天都在尝试设置 SFML.... 我从该站点下载了 1.6,然后在 VS2010 中对其进行了重建,但遗憾地发现这并没有生成我习惯使用的 sfml-system-d.lib 文件,并且只生成了新的 system-s 和system-sd 库。

然后我仔细观察了这个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 文件的额外依赖。
  • 出于沮丧,我将每个 dll 文件都放在了 .exe 旁边

【问题讨论】:

    标签: multithreading sfml


    【解决方案1】:

    听起来您可能在构建 SFML 时没有链接到 CRT。 (ios_width为iostream,需要CRT库。)

    您需要重建 SFML,但这次请执行以下操作:

    0。复制此库列表

    kernel32.lib
    user32.lib
    gdi32.lib
    winpool.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. 如果您在“图书管理员”选项卡中,请设置 将库依赖项链接到 YES

    5. 每次都重复步骤 1-4 更改 Debug 的构建设置 DLL、调试静态等

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

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

    【讨论】:

    • 所以我需要做的就是改变依赖关系?难道我也需要一些 dll 文件吗?
    • 我是否需要更改每个项目中的依赖项(主、音频、图形),并且每次我将调试 DLL 切换为静态调试
    • 抱歉,有一段时间没上网了(有点意外)。更改依赖项应该是所有需要的,是的,每个项目配置(调试 DLL、调试静态、发布 DLL、发布静态)都需要重新配置。如果您使用静态构建路线(即构建调试静态或发布静态),则不需要任何 DLL,而不是 openal32 或 libsndfile 用于发布(如果这就是您的意思),并且除了源中的内容之外,您不需要任何东西分发构建。
    猜你喜欢
    • 2010-10-10
    • 1970-01-01
    • 1970-01-01
    • 2013-09-10
    • 2011-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多