6

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

所以我用谷歌搜索了一下并安装了 objc2 并尝试了:

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

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

4

3 回答 3

1

在我的 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.xy 如果您的命令不包含 -lobjc,我看不出它如何正确链接。我可能是错的,但没有它对我不起作用。

于 2013-03-11T23:17:38.200 回答
0

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

于 2013-02-17T13:53:33.140 回答
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-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.mo

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 包。

于 2013-02-19T16:53:54.933 回答