使用GCC、ObjectiveC代码和Cygwin的帮助

5

在cygwin下使用GCC正确地构建Objective-C代码是否可能?

我有一个应该在Mac环境中工作的应用程序,但是用gcc无法使最基本的东西工作。我需要安装更多的库吗?

#import "HelloWorldApp.h"

int main(int argc, char *argv[]) {
    return 0;
} // End of the // 

@interface Car
{
    int test;
}

//The registration is a read-only field, set by copy
@property int (readonly, copy) test;

//the driver is a weak reference (no retain), and can be modified
//@property Person* (assign) driver;

@end


CC=gcc
CXX=gcc-g++
LD=$(CC)

CFLAGS=

LDFLAGS=-lobjc

all: HelloWorld

HelloWorld: HelloWorld.o
    $(LD) $(LDFLAGS) -o $@ $^

%.o: %.m
    $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@

clean:
    rm -rvf *.o HelloWorld HelloWorld.exe

错误:

gcc -c HelloWorld.m -o HelloWorld.o
In file included from HelloWorld.m:6:
HelloWorldApp.h:19: error: stray '@' in program
HelloWorldApp.h:19: error: parse error before "int"
make: *** [HelloWorld.o] Error 1
3个回答

2

@ Malaxeur - 你说得一点没错。我一直在PC上用ObjC,遇到了与你相同的问题——我的路径指向了v3.x的gcc编译器。我切换到4.x版本就解决了问题!

值得注意的是,“stray '@'”错误也会出现在拼写“implementation”错误的情况下,这有点误导人。

总之,感谢你的帮助。


2
我认为这是因为你正在使用Objective-C 2.0,这是苹果开发的私有扩展,并且他们没有将其贡献给“标准”,即FSF GCC。因此,你的mingw编译器(它不是基于苹果的编译器,而是基于FSF的编译器)无法理解新的语法,比如属性。

3
Objective-C 没有标准。基本上有 GNU 的版本和 Apple 的版本(也许还有一些很少用的版本)。GNU的版本已经过时,源代码中充满了“这是一个 hack ”的注释。 - dreamlax

-1

你尝试过直接从命令行运行gcc命令而不是通过makefile吗?

找到了这个参考资料:

摘自http://www.cs.indiana.edu/classes/c304/ObjCompile.html

编译Objective-C

可以使用GNU C编译器gcc来编译Objective-C代码。Objective-C接口文件通常以.h作为扩展名,如List.h。实现文件通常以.m作为扩展名,如List.m。实现文件应该# import其相应的接口文件。您的主程序还应该# import它所使用的所有类的接口文件。 通常,您会希望单独编译实现类的文件。例如,要编译List.m,请使用以下命令:

gcc -c -Wno-import List.m

-c开关告诉编译器生成一个对象文件List.o,然后可以将其链接到您的程序中。对于每个实现文件和主程序都要这样做。

-Wno-import开关告诉编译器,如果您的代码中有#import语句,则不会发出警告。由于某种原因,GNU项目创始人Richard Stallman不喜欢#import结构。

当您准备编译程序时,可以再次使用gcc链接所有类的实现。例如,要编译文件List.o和main.o,可以使用以下命令:

gcc -o prog -Wno-import List.o main.o -lobjc

-o prog告诉gcc创建一个名为prog的可执行程序(如果您没有指定,则默认为a.out)。

请注意,在使用gcc链接Objective-C时,需要使用-lobjc开关指定Objective-C库。如果gcc报错,请联系系统管理员确保在构建gcc时安装了Objective-C库和头文件(objc/Object.h)。


我想补充一点,你应该注意gcc的版本。我不得不运行gcc版本4(因为cygwin安装了3作为我的主要gcc版本),才能编译Objective C。 - Malaxeur
我也谷歌了一下,这就是我的Makefile里的内容。但是,代码仍然无法编译。我猜测这是因为Objective-C不是真正的Objective.c。 - Berlin Brown

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