clang编译错误(undefined reference to objc_autoreleasepoolpush)

7

所以,我安装了Ubuntu和clang3.0,还有一个简单的程序.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

所以我进行了一些谷歌搜索并安装了objc2并尝试了以下操作:

clang first.m -I /usr/include/GNUstep/ -lgnustep-base -fconstant-string-class=NSConstantString -objc2

但是仍然没有变化。也许有人遇到过同样的问题并解决了吗?
3个回答

2

在我的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,我不认为它能够正确链接。可能我错了,但没有它它对我来说是无法正常工作的。

感谢 WeakPointer ) clang first.m gnustep-config --objc-flags gnustep-config --objc-libs -I /usr/include/GNUstep/ -lgnustep-base -I /home/nazar/libobjc2/这个命令可以正常工作,但是我收到了警告:在编译期间未使用的参数:'-shared-libgcc'再次感谢 ) - Manifestor
现在我收到了警告:/usr/lib/libgnustep-base.so所需的libobjc.so.3可能与libobjc.so.4发生冲突。 - Manifestor

1

我不确定这是否适用于GNUstep,但在OS X上,如果您想使用ARC编译,则必须添加-fobjc-arc编译器标志。


1
根据http://wiki.gnustep.org/index.php/ObjC2_FAQ,您需要添加“-fobjc-nonfragile-abi”选项。 - Martin R

1

尝试使用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-exceptions -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. -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.m.o -L/usr/local/lib -lgnustep-base -lobjc -lm

具体取决于如何配置GNUstep make包。


什么?makefile与OP的链接器问题有什么关系? - trojanfoe
这不仅仅是一个Makefile,它还包含了配置选项。GNUstep Make包通常提供用于构建GNUstep库的选项,包括链接器选项。 - Fred Frith-MacDonald

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接