如何让xcodebuild生成的中间文件与.o文件使用相对路径?
我之前也碰到过完全一样的困扰——把构建好的项目迁移到另一台机器跑单元测试,结果因为.o文件和中间产物里的硬编码绝对路径不匹配,直接卡壳了。折腾了好一阵,终于整理出几个可行的方案,分享给你:
一、构建前修改Xcode配置,从根源避免绝对路径
这是最省心的方式,让xcodebuild一开始就生成相对路径的产物:
指定相对路径的构建目录
执行xcodebuild命令时,通过BUILD_DIR和SYMROOT参数把构建产物目录设为项目根目录下的相对路径,比如:xcodebuild -project YourProject.xcodeproj -scheme YourScheme BUILD_DIR=./build SYMROOT=./build这样所有中间文件、.o文件都会生成在项目根目录的
build文件夹里,路径信息也会基于这个相对目录生成。调整项目构建设置
打开你的Xcode项目,在Build Settings里做两个关键修改:- 把
DEPLOYMENT_LOCATION设为NO,避免Xcode生成绝对路径的安装位置 - 把
INSTALL_PATH改成相对路径,比如@executable_path/../Frameworks,这是iOS/macOS项目常用的相对路径格式
- 把
配置Derived Data为相对路径
Xcode的Derived Data默认是绝对路径,你可以在Xcode偏好设置的Locations里,把Derived Data的位置改成Relative,这样中间产物会放在项目目录下的DerivedData文件夹里。如果用命令行构建,也可以直接指定参数:xcodebuild -project YourProject.xcodeproj -scheme YourScheme DERIVED_DATA_PATH=./DerivedData
二、修改已生成的构建产物(适合已经构建完的情况)
如果已经有了带硬编码路径的产物,也不用重新构建,用install_name_tool来修改二进制文件里的路径:
install_name_tool -change /Users/MyBuildUser/BuildFolder/XcodeProject /Users/MyTestUser/TestFolder/XcodeProject YourAppBinary
要是有大量文件需要修改,写个简单的shell脚本批量处理会更高效,比如遍历build文件夹里的所有二进制文件,替换路径。
三、验证修改是否生效
改完之后可以用otool工具检查二进制文件里的路径:
otool -l YourAppBinary | grep path
如果输出的路径是相对路径或者目标机器的路径,就说明修改成功了。之后把整个项目(包括build文件夹)迁移到测试机器,直接执行测试命令:
xcodebuild test -project YourProject.xcodeproj -scheme YourScheme -destination 'platform=iOS Simulator,name=iPhone 15'
(根据你的实际测试目标调整destination参数)
本质上,Xcode默认写入绝对路径是为了调试时能精准定位源码,但这确实给跨机器迁移带来了麻烦。上面的方法要么从构建源头控制路径生成,要么修改已有的产物路径,都能解决你的问题。
内容的提问来源于stack exchange,提问作者Dan

