SDL3作为Git子模块链接时遇未定义引用及编译错误求助
问题解决指南
未定义引用错误的根源
你一开始用target_link_directories链接SDL3::SDL3是错误用法——这个指令是用来指定库文件路径的,而SDL3::SDL3是CMake生成的导入目标,正确操作是用target_link_libraries直接链接它,这也是你后来尝试的操作,但由此触发了宏冲突问题。
towupper宏冲突错误的解决
这个错误是Cygwin环境特性导致的:系统头文件(比如wctype.h)已经定义了towupper宏,而SDL3的SDL_hidapi_windows.h里又重复定义了该宏,直接引发语法冲突。按以下步骤修复:
1. 修改CMakeLists.txt添加预定义宏
在引入SDL3子模块前,添加禁止SDL重定义towupper的宏:
cmake_minimum_required(VERSION 3.5.0) project(project VERSION 0.1.0 LANGUAGES CXX) set(CMAKE_CXX_STANDARD 17) # 预定义宏,避免towupper宏冲突 add_definitions(-DSDL_NO_TOWUPPER_REDIRECT) add_subdirectory(extern/sdl) include_directories(Inc) add_executable(project Src/main.cpp) target_include_directories(project PUBLIC extern/sdl/include) # 正确链接SDL3目标 target_link_libraries(project PRIVATE SDL3::SDL3)
2. 调整代码头文件包含顺序
如果代码里先包含了系统头文件再包含SDL头文件,也会触发冲突。可以在包含SDL头文件前手动定义宏:
#define SDL_NO_TOWUPPER_REDIRECT #include <SDL3/SDL.h>
3. 检查Cygwin依赖
确保Cygwin已经安装libhidapi-devel这类SDL3依赖库,避免后续出现其他编译问题。
内容的提问来源于stack exchange,提问作者Karol Borecki
相关产品推荐
相关产品推荐

