C++ 使用纯CMake构建SFML时出现运行时错误

C++ 使用纯CMake构建SFML时出现运行时错误,c++,cmake,sfml,clion,C++,Cmake,Sfml,Clion,我正在启动一个使用SFML2.5.1的项目。我在Windows上,我正在尝试使用纯CMake进行构建。CMake和编译步骤似乎工作正常,但当我尝试在CLion中运行程序时,出现以下错误: 过程已完成,退出代码为-1073741515 此外,如果我在命令行中找到可执行文件并尝试在其中运行,程序将崩溃,并显示以下消息: 无法继续执行代码,因为找不到sfml-window-d-2.dll。 对于上下文,我的项目在其根目录中有一个main.cpp文件,以及我的CMakeLists.txt文件。根目录还包

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

过程已完成,退出代码为-1073741515

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

无法继续执行代码,因为找不到sfml-window-d-2.dll。

对于上下文,我的项目在其根目录中有一个main.cpp文件,以及我的CMakeLists.txt文件。根目录还包含从“源代码”下载链接下载的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”应用程序

#包括
int main()
{
窗口窗口(sf::视频模式(800600),“我的窗口”);
while(window.isOpen())
{
sf::事件;
while(window.pollEvent(事件))
{
如果(event.type==sf::event::Closed)
window.close();
}
}
返回0;
}
我的CMakeLists.txt文件中是否缺少某些内容

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


编辑2:将
set(BUILD\u SHARED\u LIBS FALSE)
添加到我的CMakeLists.txt文件中就成功了。我的最小程序正在运行

缺少文件
sfml-window-d-2.dll
。将包含SFML DLL的目录的路径添加到Code::Block动态库搜索路径(如果C::B中有这样的内容),或者将其添加到path环境变量,或者将这些库复制到包含可执行文件的文件夹中。您可以添加一个生成后步骤来复制这些库

编辑: 我不能评论,因为我的名声不好


您可以构建SFML静态库以避免复制DLL。您必须在CMake中禁用
BUILD\u SHARED\u LIBS
选项。

由于未找到sfml-window-d-2.dll,因此无法继续执行代码-这与生成应用程序无关。您的应用程序在运行时正在查找此DLL,但找不到它(无论是在应用程序目录中还是在
路径上)。“如果链接到SFML的动态版本,请不要忘记将SFML DLL(它们位于)复制到编译的可执行文件所在的目录。”,但我想知道是否有任何方法可以使用CMake从头开始构建SFML,而无需复制和粘贴dll,或者单独构建SFML,然后链接它。毕竟,dll首先是通过构建SFML创建的。请参阅OP上的编辑。我从未说过我使用的是Code::Blocks。我的目标是使用纯CMake。请看OP上的编辑。哦,对不起。。在寻找SFML时,我犯了一个错误(大多数教程都在C::B中)。请参阅我的编辑。它应该可以解决您的问题。哇,将
set(BUILD\u SHARED\u LIBS FALSE)
添加到我的CMakeLists.txt文件中,实际上就成功了。非常感谢你!