使用Xcode调试链接错误 - SDL静态库

3

我正在尝试按照这个指南构建SDL2用于iOS:

http://lazyfoo.net/tutorials/SDL/52_hello_mobile/ios_mac/index.php

我能够构建libSDL2.a静态库,但是当我尝试构建使用它的示例hello world应用程序时,出现链接器错误。
Ld /Users/testuser/Library/Developer/Xcode/DerivedData/___PROJECTNAME___-egvszvnfjpicgqdtaazpczjuebut/Build/Products/Debug-iphonesimulator/___PROJECTNAME___.app/___PROJECTNAME___ normal x86_64
    cd "/Users/testuser/Documents/iosBuild/SDL iOS Application"
    export IPHONEOS_DEPLOYMENT_TARGET=10.0
    export PATH="/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin"
    /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -arch x86_64 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator10.0.sdk -L/Users/testuser/Library/Developer/Xcode/DerivedData/___PROJECTNAME___-egvszvnfjpicgqdtaazpczjuebut/Build/Products/Debug-iphonesimulator -F/Users/testuser/Library/Developer/Xcode/DerivedData/___PROJECTNAME___-egvszvnfjpicgqdtaazpczjuebut/Build/Products/Debug-iphonesimulator -filelist /Users/testuser/Library/Developer/Xcode/DerivedData/___PROJECTNAME___-egvszvnfjpicgqdtaazpczjuebut/Build/Intermediates/___PROJECTNAME___.build/Debug-iphonesimulator/___PROJECTNAME___.build/Objects-normal/x86_64/___PROJECTNAME___.LinkFileList -mios-simulator-version-min=10.0 -Xlinker -object_path_lto -Xlinker /Users/testuser/Library/Developer/Xcode/DerivedData/___PROJECTNAME___-egvszvnfjpicgqdtaazpczjuebut/Build/Intermediates/___PROJECTNAME___.build/Debug-iphonesimulator/___PROJECTNAME___.build/Objects-normal/x86_64/___PROJECTNAME____lto.o -Xlinker -export_dynamic -Xlinker -no_deduplicate -Xlinker -objc_abi_version -Xlinker 2 -lSDL2 -framework GameController -framework Foundation -framework UIKit -framework OpenGLES -framework QuartzCore -framework CoreAudio -framework AudioToolbox -framework CoreGraphics -framework CoreMotion -Xlinker -dependency_info -Xlinker /Users/testuser/Library/Developer/Xcode/DerivedData/___PROJECTNAME___-egvszvnfjpicgqdtaazpczjuebut/Build/Intermediates/___PROJECTNAME___.build/Debug-iphonesimulator/___PROJECTNAME___.build/Objects-normal/x86_64/___PROJECTNAME____dependency_info.dat -o /Users/testuser/Library/Developer/Xcode/DerivedData/___PROJECTNAME___-egvszvnfjpicgqdtaazpczjuebut/Build/Products/Debug-iphonesimulator/___PROJECTNAME___.app/___PROJECTNAME___

ld: library not found for -lSDL2
clang: error: linker command failed with exit code 1 (use -v to see invocation)

根据他的指示,我复制了项目模板,并在“Build Phases”->“link binary with libraries”菜单下添加了我构建的libSDL2.a库。

enter image description here

任何建议我如何调试这个问题?
编辑:我的项目中使用的库中的构建目标配置:

enter image description here

enter image description here


1
你确定架构是正确的吗?如果你为设备单独构建它,那么你将无法在模拟器中使用它...首先要检查一下... - Macmade
我相信我为正确的目标构建了它,但这就是我的问题所在,我不确定如何确保。当我运行lipo工具时,这是针对我构建的用于在iPhone 5模拟器中运行的库的输出:lipo -info libSDL2.a 输入文件libSDL2.a不是一个fat文件 非fat文件:libSDL2.a的架构是i386。 - RandomUser
2个回答

2
你构建的静态库很可能不包含你要构建应用程序所需的体系结构。你需要构建一个静态库,其中包含你想要构建的平台的体系结构。
另外,请注意,将不同平台的体系结构(如iOS和tvOS,甚至是iOS和iOS模拟器 - 模拟器是独立的平台)放入单个二进制文件中并不被支持。你需要为每个你要针对的平台创建单独的库或框架,尽管每个库或框架可以包含该平台支持的所有体系结构。

据我所知,我为正确的目标构建了它,但这就是我的问题所在,我不确定如何确保。当我运行lipo工具时,这是我针对在iPhone 5模拟器中运行的库所构建的输出:lipo -info libSDL2.a 输入文件libSDL2.a不是一个fat文件 非fat文件:libSDL2.a的架构是:i386 - RandomUser
在你上面的命令中,你有"...clang -arch x86_64",所以你正在尝试将i386静态存档链接到x86_64二进制文件。 - Myke Olson
我该如何更改它?我已经添加了此项目的构建配置截图,我看到2个字段:架构和有效架构,但都没有列出x86_64。 - RandomUser

2

使用此脚本构建您的库。最终产品将放置在您的主目录下的~/SDL目录中。

#!/bin/sh

PREFIX=$HOME/SDL
SYMROOT="SYMROOT=$PREFIX/release"

SDK_DEVICE="-sdk iphoneos"
SDK_SIMULATOR="-sdk iphonesimulator"
CONF_DEBUG="-configuration Debug"
CONF_RELEASE="-configuration Release"

mkdir -p $PREFIX
cd $PREFIX

wget https://www.libsdl.org/release/SDL2-2.0.4.zip
unzip SDL2-2.0.4.zip
rm -f SDL2-2.0.4.zip

# ------------------------------------------------------------------------
# SDL
# ------------------------------------------------------------------------
cd $PREFIX/SDL2-2.0.4/Xcode-iOS/SDL
SCHEME="libSDL"
PROJ="-project SDL.xcodeproj"

#xcodebuild OTHER_CFLAGS="-fembed-bitcode" OTHER_LDFLAGS="-lobjc"   ONLY_ACTIVE_ARCH=NO -arch i386 -arch x86_64 $PROJ $SDK_SIMULATOR      $CONF_DEBUG   -scheme='$SCHEME' build      $SYMROOT
xcodebuild OTHER_CFLAGS="-fembed-bitcode"  ONLY_ACTIVE_ARCH=NO -arch i386 -arch x86_64 $PROJ $SDK_SIMULATOR  $CONF_RELEASE -scheme='$SCHEME' build      $SYMROOT
#xcodebuild OTHER_CFLAGS="-fembed-bitcode" OTHER_LDFLAGS="-lobjc" ONLY_ACTIVE_ARCH=NO -arch arm64 -arch armv7 $PROJ $SDK_DEVICE      $CONF_DEBUG   -scheme='$SCHEME' build      $SYMROOT
xcodebuild OTHER_CFLAGS="-fembed-bitcode"  ONLY_ACTIVE_ARCH=NO -arch arm64 -arch armv7 $PROJ $SDK_DEVICE     $CONF_RELEASE -scheme='$SCHEME' build      $SYMROOT

lipo $PREFIX/release/Release-iphonesimulator/libSDL2.a $PREFIX/release/Release-iphoneos/libSDL2.a -create -output $PREFIX/libSDL2.a

非常感谢,我之前不知道 Xcode 中有这个 cli。我使用了你的脚本来构建库,然后修改它以构建使用该库的项目。这将是简化我的 iOS 目标构建流程的好方法,非常感谢你的提示。 - RandomUser
很高兴能够帮助。当构建所有的SDL库 - sdl2_ttf、sdl2_image、sdl2_mixer和sdl2_net时,解决方案甚至更加强大。这确实可以节省一些时间。 - ha100

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接