c++ - 无法使用 MSVC/Clang 在 Windows 上将 SDL2 与 CMake 链接
问题描述
我尝试在 Windows 上使用 SDL2,使用 Visual Studio 2019 附带的 clang,但无法链接。
这是一个我无法链接的最小示例。
CMakeLists.txt:
cmake_minimum_required(VERSION 3.10)
project(test VERSION 1.0)
# C++ standard
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED True)
set(CMAKE_VERBOSE_MAKEFILE ON)
# add the executable
add_executable(simpleui src/simpleui/simpleui.cpp)
# Link SDL2
add_library(SDL2 SHARED IMPORTED)
set_target_properties(SDL2 PROPERTIES
IMPORTED_LOCATION "C:/Program Files/SDL2-2.0.12/lib/x64/SDL2.dll"
IMPORTED_IMPLIB "C:/Program Files/SDL2-2.0.12/lib/x64/SDL2.lib"
LINKER_LANGUAGE C
)
target_include_directories(simpleui PUBLIC "C:\\Program Files\\SDL2-2.0.12\\include")
target_link_libraries(simpleui SDL2)
# subsystem
target_link_options(simpleui PUBLIC -Xlinker /subsystem:windows)
简单的ui.cpp
#include <SDL.h>
#include <Windows.h>
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow)
{
SDL_Init( SDL_INIT_VIDEO );
SDL_Quit();
return 0;
}
SDL2 位于C:/Program Files/SDL2-2.0.12
这是我得到的错误:
C:\PROGRA~2\MICROS~2\2019\COMMUN~1\VC\Tools\Llvm\bin\CLANG_~1.EXE -fuse-ld=lld-link -nostartfiles -nostdlib -g -Xclang -gcodeview -O0 -D_DEBUG -D_DLL -D_MT -Xclang --dependent-lib=msvcrtd -Xlinker /subsystem:windows @CMakeFiles\simpleui.dir\objects1.rsp -o simpleui.exe -Xlinker /implib:simpleui.lib -Xlinker /pdb:C:\repos\ice\cmake-build-debug\simpleui.pdb -Xlinker /version:0.0 @CMakeFiles\simpleui.dir\linklibs.rsp
lld-link: error: undefined symbol: _SDL_Init
>>> referenced by C:\repos\ice\src\simpleui\simpleui.cpp:8
>>> CMakeFiles/simpleui.dir/src/simpleui/simpleui.cpp.obj:(_wWinMain@16)
lld-link: error: undefined symbol: _SDL_Quit
>>> referenced by C:\repos\ice\src\simpleui\simpleui.cpp:9
>>> CMakeFiles/simpleui.dir/src/simpleui/simpleui.cpp.obj:(_wWinMain@16)
CLANG_~1: error: linker command failed with exit code 1 (use -v to see invocation)
所以它似乎无法链接 SDL。以下是 的内容@CMakeFiles\simpleui.dir\linklibs.rsp
:
"C:/Program Files/SDL2-2.0.12/lib/x64/SDL2.lib" -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32 -loldnames
看来这捡到了.lib
。但是指定的路径在哪里.dll
呢?也许这就是问题所在,因为它找不到.dll
,但我已经在IMPORTED_LOCATION
.
解决方案
由于@Ric 的评论,我发现了问题:我使用的是 32 位编译器和 64 位版本的库。
推荐阅读
- php - 警告:session_start() 期望参数 1 是数组,给定字符串
- plsql - ORA-19280: XQuery 动态类型不匹配: 预期原子值 - 得到节点
- list - Tcl/Tk:从一列数据创建列表时如何忽略换行符?
- sql - SQL 增量记录数
- c - 在没有 printf 的情况下限制 c 中的浮点精度
- sql - Oracle SQL 中按时间段累积的第 90 个百分位值
- angular - 本地 Angular 构建成功,但 Gitlab 运行器 Angular 构建失败
- node.js - ECS Fargate Node.js child_process NoCredentialProviders:链中没有有效的提供者。已弃用
- java - Jnativehook Mouse Listener 问题(Java)
- regex - 使用 Python 正则表达式查找和编辑文本文件的内容