使用MXE CMake交叉编译Windows SDL程序时出现make错误如何解决?
问题原因
该错误由MXE环境下SDL2的CMake导入目标配置缺陷与CMake版本策略不兼容共同导致:
- 你使用的CMake版本开启了CMP0111策略检查,要求Windows平台的导入目标必须配置
IMPORTED_IMPLIB(导入库)属性,但MXE提供的静态编译版SDL2没有生成该属性(静态库本身不需要导入库,属于SDL2在MXE下的配置疏漏) - 配置阶段CMake判定
SDL2::SDL2目标缺失必要属性,生成Makefile时会将该目标替换为无效值SDL2::SDL2-NOTFOUND,make解析该无效target时就会抛出target pattern contains no '%'的语法错误 - *nix原生环境下SDL2的CMake配置符合平台规则,没有导入库属性要求,因此可以正常编译。
修复方案
可任选以下任意一种方案解决:
- 方案1:调整CMake策略跳过检查
在CMakeLists.txt的cmake_minimum_required行之后、project行之前添加如下代码,关闭CMP0111的严格检查:cmake_policy(SET CMP0111 OLD) - 方案2:改用SDL2变量替代导入目标
跳过SDL2::SDL2导入目标,直接使用find_package输出的变量完成链接,将CMakeLists.txt修改为如下内容:cmake_minimum_required(VERSION 3.5) project(untitled LANGUAGES CXX) set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON) find_package(SDL2 REQUIRED) include_directories(${SDL2_INCLUDE_DIRS}) add_executable(untitled main.cpp) target_link_libraries(untitled ${SDL2_LIBRARIES}) - 方案3:重装MXE的SDL2静态包
回到MXE源码根目录,执行如下命令重新编译安装SDL2静态版本,修复可能损坏的包配置:make sdl2 MXE_TARGETS=i686-w64-mingw32.static
内容的提问来源于stack exchange,提问作者user17041628
相关产品推荐
相关产品推荐

