Xcode 4构build成功,命令行构build失败?
我在Xcode 4(最新的非beta版本)中有一个项目,在Xcode本身内置的时候可以很好地构build。 具体而言,Ld命令正确使用派生的数据目录(包含依赖静态库的构build产品所在的位置)。
但是,当我从命令行构build相同的项目时,Ld命令会失败,因为它试图使用未填充的项目中的/ build文件夹。
我已经尝试调整我所了解的每个构build设置,无论是在父项目还是从属项目中。
任何想法在哪里开始debugging呢? 我可以根据需要提供更多信息。
编辑1:完整的Xcode构build命令:
xcodebuild -project AppName.xcodeproj -target AppName -configuration "Config Name"
其中AppName
和Config Name
都是构build的正确值。
编辑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命令构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
好的,几乎6个小时后,我已经使构build在Xcode和命令行(以及构build服务器上,本练习的全部内容)中正确工作。
一路上,我会修复一个问题,只是为了导致另一个 – 我会显然修复链接器/ Ld问题,只会导致编译问题(“SomeClass未声明(首次在此函数中使用)”或“SomeHeader.h:没有这样的文件或目录“错误是常见的)。
这是我调整几乎所有可以find的设置的时间之一,所以很难说出究竟是什么错误,什么修正了它。
我认为可能有帮助的事情如下:
- 转换的构build使用Xcode工作区和scheme(而不是项目和目标)
- 重新安排的工作区将App项目和静态库作为兄弟(不是父/子)
- 将Xcode和工作区设置更改为使用在目标中指定的构build位置
- 更改构build产品path为应用程序和库使用../build(这两个项目文件都包含在一个主目录的同级子文件夹,所以让他们构build到相同的文件夹解决了原来的链接器/ Ld命令问题,我认为 )
- 编辑Appscheme以明确构build库目标,并在App目标之前构build它
- 在App目标的构build阶段中,在“与库链接二进制文件”下明确添加库
- 将库的.a文件引用的位置types更改为“相对于构build产品”
- 添加一个“复制标题”构build阶段到库项目,添加适当的标题到公共部分
- 将库项目的Public Headers文件夹path更改为“/ include”
- 将库的安装目录更改为
$(BUILT_PRODUCTS_DIR)
- 将App目标库searchpath和用户头searchpath更改为
$(BUILT_PRODUCTS_DIR)
(recursion) - 在我的Jenkins构build服务器上构build之前添加了一个Clean命令
- 为build命令添加了显式的SDK和Arch参数
- 从构buildconfiguration名称中删除空格
最终生成命令如下所示:
xcodebuild -workspace ClientName.xcworkspace -scheme AppName -configuration "ProdAdHoc" -sdk iphoneos -arch "armv6 armv7"
debugging此问题时使用了一些有用的资源:
- 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
无论如何,我希望我已经有足够多的关键字,以至于任何在将来有类似的构build问题的人都会发现这个问题,并发现它是有用的。 我不知道我在Xcode 3.x中多次执行的工作stream如何在移植到Xcode 4时变得如此糟糕,希望Apple能够在将来的版本中清除它。
这对我来说是一个学习经验,通过所有这一切似乎清理了事先提供的自动完成的问题。 我会说事情会变得更糟。 我仍然可以开发SharePoint。
我昨天遇到了同样的问题,能够解决这个问题。 为了缩小James的工作范围,我将指出我必须做的事情。 我不得不添加一个工作区,并切换到工作区/scheme而不是项目/目标运行xcodebuild。
使用工作区/scheme强制xcodebuild使用DerivedData文件夹,而不是主项目下的构build输出文件夹。 这允许链接器find关联的静态库。
这个博客文章是非常有帮助的:
http://blog.carbonfive.com/2011/05/04/automated-ad-hoc-builds-using-xcode-4/
当我使用我的文件进行实验时,出现了这个错误,我将@implementation添加到.h文件,并将.m文件留空。 我不相信这是你的错误,但如果其他人得到它也许检查你没有这样做。
检查你是否没有在头文件中导入.m文件! 将.m改为.h解决了这个问题!
我不知道这是否适合你,但在我的情况下,我有一个以上的main.m
文件。 我所要做的只是从目标中分离出一个main.m
,并且工作。 确保你的项目中没有多个main.m
如果您查看构build日志,要求查看所有消息,则应该看到一条简短的“链接…”,其中没有任何细节。 但是,如果右键单击该行并select“展开所有脚本”,则会得到一条非常详细的行,告诉您在XCode内发出的命令。
这应该可以帮助您debugging问题。
戴夫
我遇到了类似的exception,事实certificate,我得到了project.pbxproj中的一些(空)参考清理了project.pbxproj中的空引用后,命令行构build就像xcode以前一样成功。 看看Xcode 4项目:实用程序清理pbxproj文件? 实用到清理-pbxproj文件
以供参考
突然间,我清理了一个同样的问题,起初我惊慌失措,我看着:
linker command failed with exit code 1 (use -v to see invocation)
…但它变得很容易修复,不需要命令行!
我在导航器中点击了我的项目的根目录(顶部带有“A”的蓝图图标),然后点击PROJECT部分(也可以点击TARGET部分),然后点击底部的button中间叫“validation设置”。
XCode自己validation了项目文件,并告诉我这个问题是一个重复的目标定义,并提出要解决这个问题……而这个问题已经消失了!
祝你好运!
我通过转到“库searchpath”来解决问题,并确保所有条目都正确。
就我个人而言,当我开发一个static library
时,我遇到了这个问题。 我使用了所有生产代码的static library
目标,以及作为框架的MyStaticLib.a
文件中的testing目标。
在Xcode中testing运行得很好,但在使用xcodebuild
的terminal中没有。 最终问题是static library
目标是为Standard architectures
编译的,而testing目标则是为了Standard architectures (including 64-bit)
而编译的。 将testing目标切换到Standard architectures
修复了一切。