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

我在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

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

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

好吧,接近6小时后,我已经使构建在Xcode和命令行(以及构建服务器上,本练习的全部内容)中正确工作。

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

这是我调整几乎所有可以找到的设置的时间之一,所以很难说出究竟是什么错误以及究竟是什么修复了它。

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

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

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

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

  • http://blog.carbonfive.com/2011/04/04/using-open-source-static-libraries-in-xcode-4/
  • https://devforums.apple.com/thread/91711?start=25&tstart=0
  • 无论如何,我希望我的关键词足够多,以至于任何在将来遇到类似构建问题的人都会发现这一点,并发现它很有用。 我不知道我在Xcode 3.x中多次执行的工作流如何在移植到Xcode 4时变得如此糟糕,希望Apple能够在将来的版本中清除它。

    这对我来说是一次学习体验,而通过所有这些工作似乎都清楚了我之前提供的自动完成功能的问题。 我会说事情会变得更糟。 我仍然可以开发SharePoint。


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

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

    这篇博文非常有帮助:

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


    我在试验我的文件时遇到了这个错误,我将@implementation添加到.h文件并将.m文件留空。 我不相信这是你的错误,但如果其他人得到它也许检查你没有这样做。

    链接地址: http://www.djcxy.com/p/50997.html

    上一篇: Xcode 4 build succeeds, command line build fails?

    下一篇: Linking a static library to an iOS project in XCode 4