所以,我安装了Ubuntu和clang3.0以及一个简单的program.m:
#include <Foundation/Foundation.h>
int main()
{
@autoreleasepool{
NSLog(@"Hi");
}
return 0;
}
我试着像这样编译它:
clang first.m -I /usr/include/GNUstep/ -lgnustep-base -fconstant-string-class=NSConstantString -objc
我得到了
undefined reference to objc_autoreleasePoolPush
undefined reference to objc_autoreleasePoolPop
所以我用Google搜索了一下并安装了objc2并尝试了:
clang first.m -I /usr/include/GNUstep/ -lgnustep-base -fconstant-string-class=NSConstantString -objc2
但没有任何改变。也许有人解决了同样的问题?
答案 0 :(得分:0)
我不确定这是否适用于GNUstep,但是在OS X上,如果要使用ARC进行编译,则必须添加-fobjc-arc
编译器标志。
答案 1 :(得分:0)
尝试使用GNUmakefile构建它?
这是如何写一个。
http://www.gnustep.it/nicola/Tutorials/WritingMakefiles/node2.html
可以像
一样编译和链接clang first.m -c -MMD -MP -DGNUSTEP -DGNUSTEP_BASE_LIBRARY = 1 -DGNU_GUI_LIBRARY = 1 -DGNU_RUNTIME = 1 -DGNUSTEP_BASE_LIBRARY = 1 -fobjc-runtime = gnustep-1.7 -fno-strict-aliasing -fexceptions -fobjc-异常-D_NATIVE_OBJC_EXCEPTIONS -fobjc-nonfragile-abi -D_NONFRAGILE_ABI -pthread -fPIC -DDEBUG -fno-omit-frame-pointer -Wall -DGSWARN -DGSDIAGNOSE -Wno-import -g -fgnu-runtime -fconstant-string-class = NSConstantString - 一世。 -I / usr / local / include -o obj / first.obj / first.m.o
clang -rdynamic -pthread -shared-libgcc -fexceptions -fobjc-nonfragile-abi -fgnu-runtime -o obj / first ./obj/first.obj/first.mo -L / usr / local / lib -lgnustep -base -lobjc -lm
取决于您配置GNUstep make包的方式。
答案 2 :(得分:0)
在我的Ubuntu系统上安装了libobjc2后,您的first.m文件的副本将使用此行为我编译:
clang first.m `gnustep-config --objc-flags` `gnustep-config --objc-libs` \
-I /usr/include/GNUstep/ -lgnustep-base
但也许这只是命令行末尾的拼写错误?
第一个示例末尾的-objc和第二个示例末尾的-objc2指示clang编译器分别创建名为bjc和bjc2的可执行文件。你的意思是-lobj?我认为在obj库中链接对于获取Objective-C运行时库至关重要。即使使用libobjc2项目,生成的库仍然名为libobjc.so.x.y。如果你的命令不包含-lobjc,我看不出它是如何正确链接的。我可能错了,但如果没有它,它对我没用。