Xcode 4构建成功,命令行构建失败?

时间:2011-07-11 16:15:52

标签: ios xcode xcode4 xcodebuild

我在Xcode 4(最新的非beta版本)中有一个项目,它在Xcode本身内置时可以很好地构建。具体来说,Ld命令正确使用派生数据目录(放置构建产品,包括依赖静态库)。

但是,当我从命令行构建同一个项目时,Ld命令失败,因为它正在尝试使用项目中未构建的/ build文件夹。

我已经尝试在父项和依赖项目中调整我所知道的每个构建设置。

有关从何处开始调试的想法?我可以根据需要提供更多信息。

编辑1:完整的Xcode构建命令:

xcodebuild -project AppName.xcodeproj -target AppName -configuration "Config Name"

其中AppNameConfig Name都是构建的正确值。

编辑2:链接(Ld)命令。

内置Xcode时(可行):

Ld /Users/james/Library/Developer/Xcode/DerivedData/AppName-apkmkuhwuccsbpblulxcsafyxkwa/Build/Products/Debug-iphonesimulator/AppName.app/AppName normal i386
cd /Users/james/Code/ClientName-Depot/NameOfProject/trunk/AppName
setenv MACOSX_DEPLOYMENT_TARGET 10.6
setenv PATH "/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin:/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin:/opt/local/bin:/usr/local/git/bin"
/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/llvm-gcc-4.2 -arch i386 -isysroot /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.3.sdk -L/Users/james/Library/Developer/Xcode/DerivedData/AppName-apkmkuhwuccsbpblulxcsafyxkwa/Build/Products/Debug-iphonesimulator -L/Users/james/Code/ClientName-Depot/NameOfProject/trunk/AppName -F/Users/james/Library/Developer/Xcode/DerivedData/AppName-apkmkuhwuccsbpblulxcsafyxkwa/Build/Products/Debug-iphonesimulator -filelist /Users/james/Library/Developer/Xcode/DerivedData/AppName-apkmkuhwuccsbpblulxcsafyxkwa/Build/Intermediates/AppName.build/Debug-iphonesimulator/AppName.build/Objects-normal/i386/AppName.LinkFileList -mmacosx-version-min=10.6 -lxml2 -all_load -ObjC -licucore -Xlinker -objc_abi_version -Xlinker 2 -lMyClientLibrary -lxml2 -lsqlite3.0 -framework Security -framework MessageUI -framework QuartzCore -framework MediaPlayer -framework MapKit -framework CoreLocation -framework AudioToolbox -lz.1.2.3 -framework MobileCoreServices -framework SystemConfiguration -framework CFNetwork -framework UIKit -framework Foundation -framework CoreGraphics -o /Users/james/Library/Developer/Xcode/DerivedData/AppName-apkmkuhwuccsbpblulxcsafyxkwa/Build/Products/Debug-iphonesimulator/AppName.app/AppName

使用上面的build命令从命令行构建时(这会失败):

Ld "build/AppName.build/Prod Ad Hoc-iphoneos/AppName.build/Objects-normal/armv6/AppName" normal armv6
cd /Users/james/Code/ClientName-Depot/NameOfProject/trunk/AppName
setenv IPHONEOS_DEPLOYMENT_TARGET 4.0
setenv PATH "/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Developer/usr/bin:/opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/local/git/bin:/usr/X11/bin:/opt/local/bin"
/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc-4.2 -arch armv6 -isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk "-L/Users/james/Code/ClientName-Depot/NameOfProject/trunk/AppName/build/Prod Ad Hoc-iphoneos" -L/Users/james/Code/ClientName-Depot/NameOfProject/trunk/AppName "-F/Users/james/Code/ClientName-Depot/NameOfProject/trunk/AppName/build/Prod Ad Hoc-iphoneos" -filelist "/Users/james/Code/ClientName-Depot/NameOfProject/trunk/AppName/build/AppName.build/Prod Ad Hoc-iphoneos/AppName.build/Objects-normal/armv6/AppName.LinkFileList" -dead_strip -lxml2 -all_load -ObjC -licucore -miphoneos-version-min=4.0 -lMyClientLibrary -lxml2 -lsqlite3.0 -framework Security -framework MessageUI -framework QuartzCore -framework MediaPlayer -framework MapKit -framework CoreLocation -framework AudioToolbox -lz.1.2.3 -framework MobileCoreServices -framework SystemConfiguration -framework CFNetwork -framework UIKit -framework Foundation -framework CoreGraphics -o "/Users/james/Code/ClientName-Depot/NameOfProject/trunk/AppName/build/AppName.build/Prod Ad Hoc-iphoneos/AppName.build/Objects-normal/armv6/AppName"

返回:

ld: library not found for -lMyClientLibrary
collect2: ld returned 1 exit status
Command /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc-4.2 failed with exit code 1

10 个答案:

答案 0 :(得分:42)

好的,几乎6个小时(可计费)小时后,我已经让构建在Xcode和命令行上正常工作(在构建服务器上,这个练习的全部内容)。

一路上我会解决一个问题只是为了引起另一个问题 - 我显然会修复链接器/ Ld问题,只会导致编译问题(“SomeClass未声明(首次在此函数中使用)”或“SomeHeader.h:没有这样的文件或目录“错误是常见的。”

有几次我调整了几乎所有我能找到的设置,所以很难说出究竟是什么错误以及究竟是什么修复它。

我认为可能帮助的事情如下:

  • 转换构建以使用Xcode工作区&方案(而不是项目和目标)
  • 重新排列工作区,将App项目和静态库作为兄弟姐妹(而不是父/子)
  • 更改了Xcode和工作区设置,以使用目标
  • 中指定的构建位置
  • 更改应用程序和库的构建产品路径以使用../build(两个项目文件都包含在主目录的兄弟子文件夹中,因此将它们构建到同一文件夹中解决了原始链接器/ Ld命令问题,我< EM>认为)
  • 编辑App方案以显式构建Library目标,并在App target
  • 之前构建它
  • 在App目标的构建阶段,在“Link Binary With Libraries”下明确添加库
  • 将库的.a文件引用的位置类型更改为“相对于构建产品”
  • 向“库”项目添加了“复制标题”构建阶段,并将相应的标题添加到“公共”部分
  • 将库项目的公共标题文件夹路径更改为“/ include”
  • 将库的安装目录更改为$(BUILT_PRODUCTS_DIR)
  • 将应用目标的图书馆搜索路径和用户页眉搜索路径更改为$(BUILT_PRODUCTS_DIR)(递归)
  • 在我的Jenkins构建服务器上构建之前添加了一个Clean命令
  • 为构建命令
  • 添加了显式SDK和Arch参数
  • 从构建配置名称中删除了空格

最终构建命令如下所示:

xcodebuild -workspace ClientName.xcworkspace -scheme AppName -configuration "ProdAdHoc" -sdk iphoneos -arch "armv6 armv7"

我在调试此问题时使用的一些有用资源:

无论如何,我希望我已经在上面写了足够多的关键词,以后任何有类似构建问题的人都会发现这一点并发现它很有用。我不知道当我转到Xcode 4时,我在Xcode 3.x中多次使用的工作流程如此混乱,这里希望Apple能够在将来的版本中清理它。

这对我来说是一次学习经历,并且通过所有这些确实可以解决我之前遇到的自动完成问题。我会说情况可能会更糟;我仍然可以为SharePoint开发。

答案 1 :(得分:10)

我昨天遇到了同样的问题,并且能够解决这个问题。为了缩小对詹姆斯有用的东西,我会指出我必须做的事情。我不得不添加一个工作区并切换到运行xcodebuild with workspace / scheme而不是project / target。

使用workspace / scheme强制xcodebuild使用DerivedData文件夹而不是主项目下的构建输出文件夹。这允许链接器找到关联的静态库。

这篇博客文章非常有帮助:

http://blog.carbonfive.com/2011/05/04/automated-ad-hoc-builds-using-xcode-4/

答案 2 :(得分:4)

我在尝试使用我的文件时出现此错误,我将@implementation添加到.h文件并将.m文件留空。我不相信这是你的错误,但如果其他人得到它可能会检查你没有这样做。

答案 3 :(得分:2)

检查您是否未在头文件中导入.m文件!将.m更改为.h为我解决了这个问题!

答案 4 :(得分:2)

我不知道这是否适合您,但在我的情况下,我有多个main.m文件。我所要做的只是将main.m中的一个从目标中分离出来并且有效。确保项目中没有多个main.m

答案 5 :(得分:1)

如果你查看构建的日志,要求查看所有消息,你应该看到一条简洁的行,上面写着“链接......”,它几乎没有细节。但是,如果您右键单击该行并选择“展开所有脚本”,您将获得一条非常详细的行,告诉您在XCode中发出了什么命令。

这应该可以帮助您调试问题。

戴夫

答案 6 :(得分:1)

我遇到了类似的异常, 事实证明我在project.pbxproj中得到了一些(null)引用 在我清理project.pbxproj中的那些空引用之后,命令行构建就像之前的xcode一样成功。 看看Xcode 4 project: utility to clean up pbxproj file? 效用到清理-pbxproj文件

以获取更多参考资料

答案 7 :(得分:0)

突然之后,我在清洁后遇到了同样的问题,起初我惊慌失措地看着我看到了:

<强> linker command failed with exit code 1 (use -v to see invocation)

...但它变得非常容易修复,不需要命令行!

我在导航器中单击了项目的根目录(顶部带有“A”的蓝图图标),然后单击PROJECT部分​​(您也可以单击TARGET部分)然后单击按钮在底部中间称为“验证设置”。

XCode本身验证了项目文件,并告诉我问题是一个重复的目标定义,并提出修复它...瞧,问题就此消失了!

祝你好运!

答案 8 :(得分:0)

我通过转到“图书馆搜索路径”来解决问题,并确保所有条目都正确。

答案 9 :(得分:0)

就个人而言,我在开发static library时遇到了这个问题。我拥有包含所有生产代码的static library目标,以及作为框架提取MyStaticLib.a文件的测试目标。

测试在Xcode中运行得很好,但在使用xcodebuild的终端中没有。问题最终是static library目标正在为Standard architectures进行编译,而测试目标则需要为Standard architectures (including 64-bit)进行编译。将测试目标切换到Standard architectures修复所有内容。

相关问题