0

嗨所以我正在使用 msVS++2010 并且整天都在尝试设置 SFML.... 我从网站下载了 1.6,然后在 VS2010 中重建它,但遗憾地发现这并没有导致 sfml 系统-d.lib 文件,这是我习惯使用的,并且只生成了新的 system-s 和 system-sd 库。

然后我仔细观看了这个视频,发现他通过添加 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-sd.lib 文件的额外依赖。
  • 出于沮丧,我将每个 dll 文件放在 .exe 旁边
4

1 回答 1

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. 每次更改调试 DLL、调试静态等的构建设​​置时,重复步骤 1-4。

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

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

于 2011-06-07T21:47:51.187 回答