clang编译错误(对objc_autoreleasepoolpush的未定义引用)

时间:2013-02-17 13:16:10

标签: objective-c clang gnustep

所以,我安装了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

但没有任何改变。也许有人解决了同样的问题?

3 个答案:

答案 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,我看不出它是如何正确链接的。我可能错了,但如果没有它,它对我没用。