_使用CLion的Vcpkg安装SDL2,添加至CMakelists时报错,编译报错

语言:C++20

编译器:gcc 14.2

摘要:初次使用Vcpkg添加SDL2,出现CMakelists找不到错误、编译缺失main错误、运行失败错误。


CMakelists缺失错误:

使用CLion的Vcpkg 安装SDL2时,按照指示把对应代码添加至CMakelists,结果如下图所示报错:
显示找不到指定的两个cmake文件

提示给的解决办法是要么设置CMAKE_PREFIX_PATH这个变量,要么设置SDL2_DIR变量。

但在实测中,真正有效的只有设置CMAKE_PREFIX_PATH变量。设置的位置要与实际Vcpkg里的库安装路径一致。如下图,安装的第三方库的路径,实际是在你安装的Vcpkg目录下的packages目录下(此处我的Vcpkg安装目录就在该项目工程目录下),找到对应的库目录,然后设置目录即可。

cpp 复制代码
set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} Vcpkg/packages/sdl2_x64-mingw-dynamic)


重新cmake一下,即可成功

编译缺失main

编译时会报错:

原因是在SDL2中,函数入口是如下签名,需要把int main()改为 int main(int argc, char *argv[])即可

cpp 复制代码
 int main(int argc, char *argv[])

运行失败

接下来就是运行程序,不出意外的情况下,会出现意外。此处代码表示运行时缺少dll文件

虽然我已经在CMakelists里加了这一句把SDL2.dll放到了编译的程序所在目录

cpp 复制代码
# 确保 SDL2.dll 复制到输出目录
configure_file(Vcpkg/packages/sdl2_x64-mingw-dynamic/bin/SDL2.dll ${CMAKE_CURRENT_BINARY_DIR}/SDL2.dll COPYONLY)

但依然会报错,不过由于CLion的提示信息还是有些匮乏,我们可以进入编译的程序目录,然后运行程序。会出现下面错误,没想到缺失的竟然是SDL2d.dll。这是因为此时的CMakelists使用的是Debug构建的,需要匹配的SDL2d.dll,如果是Release版本,那么就是SDL2.dll

根据这个文件可在Vcpkg目录下进行全局搜索,最后找到了这个dll文件,只是没想到出现的位置非常刁钻,分别位于三个不同的目录

不过显然最后一条路径才是正经路径。然后便是把路径添加上去

cpp 复制代码
configure_file(Vcpkg/packages/sdl2_x64-mingw-dynamic/bin/SDL2.dll ${CMAKE_CURRENT_BINARY_DIR}/SDL2.dll COPYONLY)
configure_file(Vcpkg/packages/sdl2_x64-mingw-dynamic/debug/bin/SDL2d.dll ${CMAKE_CURRENT_BINARY_DIR}/SDL2d.dll COPYONLY)

如此便可正常运行

相关推荐
代码AC不AC21 小时前
在VSCode中搭建C/C++开发环境
vs code·c/c++·开发环境搭建
_OP_CHEN2 天前
【Linux网络编程】(一)初识计算机网络:从独立主机到协议世界的入门之旅
linux·服务器·网络·网络协议·计算机网络·socket·c/c++
阿捏利2 天前
详解Mach-O(三十三)Mach-O __mod_term_func节
macos·ios·c/c++·mach-o
_OP_CHEN4 天前
【Linux系统编程】(四十五)线程池基础:日志系统设计与策略模式的优雅落地
linux·操作系统·线程池·进程·策略模式·c/c++·日志系统
_OP_CHEN4 天前
【Linux系统编程】(四十七)线程安全与线程锁深度解析:从概念到实战,避坑指南全掌握
linux·操作系统·线程池·进程·线程安全·c/c++·线程锁
_OP_CHEN4 天前
【MySQL数据库基础】(五)MySQL 数据类型深度解析:选对类型 = 性能拉满!
linux·开发语言·数据库·sql·mysql·数据类型·c/c++
_OP_CHEN5 天前
【MySQL数据库基础】(三)MySQL 库的核心操作全解析:创建、修改、备份一条龙搞定
linux·数据库·sql·mysql·c/c++·mysql操作·企业级组件
_OP_CHEN5 天前
【Linux系统编程】(四十六)线程池原理与实现:从固定线程池到线程安全单例模式
linux·单例模式·操作系统·线程池·进程·线程安全·c/c++
_OP_CHEN18 天前
【Linux系统编程】(四十)线程控制终极指南:从资源共享到实战操控,带你吃透线程全生命周期
linux·运维·操作系统·线程·进程·c/c++·线程控制
阿捏利19 天前
详解Mach-O(十五)Mach-O __DATA_CONST
macos·ios·c/c++·mach-o