Skip to content

iOS export fails to link: undefined symbols _SDL_IsIPad and _SDL_IsAppleTV in 4.7 templates #122549

Description

@LitteRabbit-37

Tested versions

  • Reproducible in 4.7.stable and 4.7.1.stable iOS export templates
  • Not reproducible in 4.6.stable

System information

macOS 15.7.7, Xcode 26.3 (17C529), iOS SDK 26.2, iPad Pro 11" (4th gen), Godot 4.7.1.stable, Mobile renderer

Issue description

Linking an exported iOS project fails with two undefined symbols:

Undefined symbols for architecture arm64:
  "_SDL_IsIPad", referenced from: SDL.ios.template_debug.arm64.o in libgodot.a
  "_SDL_IsAppleTV", referenced from: SDL.ios.template_debug.arm64.o in libgodot.a
ld: symbol(s) not found for architecture arm64

The libgodot.a shipped in the iOS template defines 869 SDL symbols, but not these two, they are the only SDL symbols in the archive left undefined. Upstream they live in SDL_uikitvideo.m, which isn't part of Godot's SDL build since only the joystick subsystem is compiled. Both the debug and release xcframeworks are affected.

This looks like it comes from #114316 (SDL3 joystick driver for iOS, merged for 4.7). CI builds the static library but never links an iOS app, linking only happens at export time, so the missing symbols pass CI.

Steps to reproduce

  1. Export any project for iOS with 4.7.1 templates, "Export Project Only"
  2. Build for an arm64 device in Xcode
  3. Linking fails with the symbols above

This can be confirmed without exporting anything, straight from the installed template:

nm libgodot.ios.debug.xcframework/ios-arm64/libgodot.a | grep -c ' T _SDL_IsIPad'   # 0
nm -u libgodot.ios.debug.xcframework/ios-arm64/libgodot.a | grep -c '_SDL_IsIPad'   # 1

Providing the two functions in the exported Xcode project makes it link, and the app runs on device with gamepad paths behaving normally:

#import <UIKit/UIKit.h>
#include <stdbool.h>

bool SDL_IsIPad(void)            { return UIDevice.currentDevice.userInterfaceIdiom == UIUserInterfaceIdiomPad; }
bool SDL_IsAppleTV(void)     { return false; }

Minimal reproduction project (MRP)

Not needed, any project exported with the official 4.7.1 iOS templates reproduces it, and the nm check above confirms it on the shipped template alone.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    Status
    Needs Further Info
    Status
    For team assessment

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions