使用纯 CMake 构建 SFML 时出现运行时错误
Runtime error when building SFML with pure CMake
我正在启动一个使用 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 文件。根目录还包含从 "Source Code" 下载 link 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
丢失。将包含 SFML DLL 的目录的路径添加到 Code::Block 动态库搜索路径(如果 C::B 中有这样的东西)或将其添加到 PATH 环境变量或简单地将这些库复制到文件夹包含可执行文件。您可以添加一个 post 构建步骤来复制这些库。
编辑:
由于我的声誉低,我无法发表评论。
您可以构建 SFML 静态库以避免复制 dll。您必须在 CMake 中禁用 BUILD_SHARED_LIBS
选项。
我正在启动一个使用 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 文件。根目录还包含从 "Source Code" 下载 link 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
丢失。将包含 SFML DLL 的目录的路径添加到 Code::Block 动态库搜索路径(如果 C::B 中有这样的东西)或将其添加到 PATH 环境变量或简单地将这些库复制到文件夹包含可执行文件。您可以添加一个 post 构建步骤来复制这些库。
编辑: 由于我的声誉低,我无法发表评论。
您可以构建 SFML 静态库以避免复制 dll。您必须在 CMake 中禁用 BUILD_SHARED_LIBS
选项。