Ale*_*lex 18 linux ubuntu compilation objective-c
如何让Objective-C项目在Ubuntu上运行?
我的文件是:
Fraction.h
#import <Foundation/NSObject.h>
@interface Fraction: NSObject {
int numerator;
int denominator;
}
-(void) print;
-(void) setNumerator: (int) n;
-(void) setDenominator: (int) d;
-(int) numerator;
-(int) denominator;
@end
Run Code Online (Sandbox Code Playgroud)
Fraction.m
#import "Fraction.h"
#import <stdio.h>
@implementation Fraction
-(void) print {
printf( "%i/%i", numerator, denominator );
}
-(void) setNumerator: (int) n {
numerator = n;
}
-(void) setDenominator: (int) d {
denominator = d;
}
-(int) denominator {
return denominator;
}
-(int) numerator {
return numerator;
}
@end
Run Code Online (Sandbox Code Playgroud)
的main.m
#import <stdio.h>
#import "Fraction.h"
int main( int argc, const char *argv[] ) {
// create a new instance
Fraction *frac = [[Fraction alloc] init];
// set the values
[frac setNumerator: 1];
[frac setDenominator: 3];
// print it
printf( "The fraction is: " );
[frac print];
printf( "\n" );
// free memory
[frac release];
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我尝试了两种方法来编译它:
纯gcc:
$ sudo apt-get install gobjc gnustep gnustep-devel
$ gcc `gnustep-config --objc-flags` -o main main.m -lobjc -lgnustep-base
/tmp/ccIQKhfH.o:(.data.rel+0x0): undefined reference to `__objc_class_name_Fraction'
Run Code Online (Sandbox Code Playgroud)我创建了一个GNUmakefile Makefile:
include ${GNUSTEP_MAKEFILES}/common.make
TOOL_NAME = main
main_OBJC_FILES = main.m
include ${GNUSTEP_MAKEFILES}/tool.make
Run Code Online (Sandbox Code Playgroud)
...并跑了:
$ source /usr/share/GNUstep/Makefiles/GNUstep.sh
$ make
Making all for tool main...
Linking tool main ...
./obj/main.o:(.data.rel+0x0): undefined reference to `__objc_class_name_Fraction'
Run Code Online (Sandbox Code Playgroud)因此,在这两种情况下编译器都会陷入困
undefined reference to `__objc_class_name_Fraction'
Run Code Online (Sandbox Code Playgroud)
你有没有想法如何解决这个问题?
这是正确的.在这两种情况下,您都没有包含Fraction.m在要编译的文件列表中,因此无法找到该类的实现Fraction
从评论中,此命令有效
gcc `gnustep-config --objc-flags` -o main *.m -lobjc -lgnustep-base
Run Code Online (Sandbox Code Playgroud)