Docker中使用CMake交叉编译SDL项目时MinGW不识别--enable-new-dtags如何解决
问题原因
--enable-new-dtags是Linux平台ELF格式文件专属的链接参数,用于指定生成DT_RUNPATH而非传统的DT_RPATH,而mingw32链接器面向Windows PE格式目标文件设计,本身不支持该参数。
该参数出现在交叉编译链接环节的根本原因是:你Docker中仅编译安装了Linux原生版本的SDL2库,其对应的CMake配置、pkg-config配置中携带了Linux平台专属的编译链接参数。当你交叉编译Windows项目调用SDL2配置时,直接继承了这些Linux专属参数,导致报错。你之前仅修改CMake工具链配置没有解决问题,就是因为调用的SDL2库本身不是为Windows平台编译的版本。
解决方法
1. 修正Dockerfile,分别编译Linux和Windows版本的SDL2
修改原有Dockerfile中SDL2编译的逻辑,分别编译原生Linux版和交叉编译Windows版的SDL2,分开安装避免混淆:
FROM ubuntu ENV DEBIAN_FRONTEND=noninteractive WORKDIR /home RUN apt-get update && apt-get install --no-install-recommends --no-install-suggests -y \ git \ build-essential \ gcc \ g++ \ mingw-w64 \ cmake \ pkg-config RUN git config --global http.sslverify false; \ git clone https://github.com/libsdl-org/SDL; \ cd SDL; \ # 编译安装Linux原生版SDL2 mkdir build-linux; \ cd build-linux; \ ../configure; \ make -j$(nproc); \ make install; \ cd ..; \ # 交叉编译安装Windows版SDL2,安装到mingw工具链目录 mkdir build-win; \ cd build-win; \ ../configure --host=x86_64-w64-mingw32 --prefix=/usr/x86_64-w64-mingw32 --disable-shared; \ make -j$(nproc); \ make install
其中--host参数指定交叉编译目标平台,--prefix指定将Windows版SDL2安装到mingw工具链的根目录,配合你CMakeLists中设置的CMAKE_FIND_ROOT_PATH,交叉编译时会自动搜索到Windows版本的SDL2配置,不会携带Linux专属链接参数。
2. 兜底方案:直接过滤无效参数
如果修改后仍偶现该参数,可以在CMakeLists.txt的Windows平台分支中添加一行,直接过滤掉无效参数:
if(PLATFORM STREQUAL "windows") # 原有工具链配置保留,新增以下行 string(REPLACE "-Wl,--enable-new-dtags" "" CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS}") endif()
内容的提问来源于stack exchange,提问作者Batawi
相关产品推荐
相关产品推荐

