【问题标题】:Unable to link SDL2 with CMake on Windows using MSVC/Clang无法使用 MSVC/Clang 在 Windows 上将 SDL2 与 CMake 链接
【发布时间】:2021-02-13 16:50:42
【问题描述】:

我尝试在 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)

simpleui.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 中指定了这个。

【问题讨论】:

  • "看起来是这样获取了.lib。但是.dll的路径在哪里指定?" - 当构建可执行文件/库时,只需要和使用.lib 文件。文件.dll 仅在运行时 时需要(和使用),当您运行可执行文件时。
  • @Tsyvarev 好的,这是有道理的。但后来我不明白错误来自哪里;)。
  • 你下载了哪个SDL2开发包? VC一还是mingw一? Clang 是 ABI-compatible with Visual studio 但不是 MinGW。
  • @Botje:VC一:SDL2-devel-2.0.12-VC.zip
  • 看看这个专为处理几个 SDL2 设置问题而创建的线程:stackoverflow.com/questions/64396979/…

标签: c++ visual-studio cmake clang sdl-2


【解决方案1】:

感谢@Ric 的评论,我发现了问题:我使用的是 32 位编译器和 64 位版本的库。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-09
    • 1970-01-01
    • 2021-09-16
    • 2020-07-13
    • 2021-03-01
    • 2016-07-05
    • 1970-01-01
    相关资源
    最近更新 更多