【问题标题】:Runtime error when building SFML with pure CMake使用纯 CMake 构建 SFML 时出现运行时错误
【发布时间】:2020-04-23 01:22:52
【问题描述】:

我正在启动一个使用 SFML 2.5.1 的项目。我在 Windows 上,我正在尝试使用纯 CMake 进行构建。 CMake 和编译步骤似乎工作正常,但是当我尝试在 CLion 中运行我的程序时,我收到以下错误:

Process finished with exit code -1073741515

此外,如果我在命令行中找到可执行文件并尝试在那里运行它,程序会崩溃并显示以下消息:

The code execution cannot proceed because sfml-window-d-2.dll was not found.

对于上下文,我的项目在其根目录中有一个文件 main.cpp,以及我的 CMakeLists.txt 文件。根目录还包含从 https://www.sfml-dev.org/download/sfml/2.5.1/ 的“源代码”下载链接下载的 SFML 源代码。

这是我的 CMakeLists.txt:

cmake_minimum_required(VERSION 3.15)
project(sfmltest)

set(CMAKE_CXX_STANDARD 17)

add_subdirectory(SFML)

include_directories(SFML/include)

add_executable(sfmltest main.cpp)

target_link_libraries(sfmltest sfml-graphics sfml-audio sfml-network sfml-window sfml-system)

这是我的 main.cpp。它只是一个标准的 SFML“Hello World”应用程序。

#include <SFML/Window.hpp>

int main()
{
    sf::Window window(sf::VideoMode(800, 600), "My window");
    while (window.isOpen())
    {
        sf::Event event;
        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
                window.close();
        }
    }
    return 0;
}

我的 CMakeLists.txt 文件中是否缺少某些内容?

编辑 1:我不想要诸如复制和粘贴 dll 之类的修复。我希望能够完全从头开始构建 SFML。这是为了确保我的项目是可移植的、跨平台的、易于设置的,并且可以使用 CLion 中的 CMake(不是 Visual Studio 或 Code::Blocks)进行编译。

编辑 2:将 set(BUILD_SHARED_LIBS FALSE) 添加到我的 CMakeLists.txt 文件中就可以了。我的最小程序现在可以运行了!

【问题讨论】:

  • 无法继续执行代码,因为找不到 sfml-window-d-2.dll -- 这与构建应用程序无关。您的应用程序在运行时正在寻找这个 DLL,但找不到它(在应用程序目录或 PATH 上)。
  • "如果您链接到 SFML 的动态版本,请不要忘记将 SFML DLL(它们在 中)复制到您编译的可执行文件所在的目录。”来自SFML Docs
  • 我知道该错误意味着缺少 dll,但我想知道是否有任何方法可以使用 CMake 从头构建 SFML,而无需复制和粘贴 dll 或单独构建 SFML 然后链接它。毕竟,dll 是通过构建 SFML 来创建的。请参阅 OP 上的编辑。

标签: c++ cmake sfml clion


【解决方案1】:

文件sfml-window-d-2.dll 丢失。将包含 SFML DLL 的目录的路径添加到 Code::Block 动态库搜索路径(如果 C::B 中有这样的东西)或将其添加到 PATH 环境变量或简单地将这些库复制到包含可执行。您可以添加将复制这些库的后期构建步骤。

编辑: 由于我的声誉低,我无法发表评论。

您可以构建 SFML 静态库以避免复制 dll。您必须在 CMake 中禁用 BUILD_SHARED_LIBS 选项。

【讨论】:

  • 从未说过我在使用 Code::Blocks。我的目标是使用纯 CMake。请参阅 OP 上的编辑。
  • 哦,对不起..我在寻找 SFML 时犯了一个错误(大部分教程都在 C::B 中)。请参阅我的编辑。它应该可以解决您的问题。
  • 哇,将set(BUILD_SHARED_LIBS FALSE) 添加到我的 CMakeLists.txt 文件中确实起到了作用。非常感谢!
猜你喜欢
  • 2013-05-25
  • 2017-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-15
  • 2019-02-03
  • 2017-04-08
相关资源
最近更新 更多