我们的机器人需要iOS客户端,于是要招iOS开发人员,而我们都不懂iOS开发,于是我紧急了解了下Objective-C(以下简称OC)的历史和语法,然后想在ubuntu上动手试试OC编程,于是按照这篇文章(http://www.techotopia.com/index.php/Installing_and_Using_GNUstep_and_Objective-C_on_Linux)搭建环境并编译helloworld代码:
gcc `gnustep-config --objc-flags` -lgnustep-base hello.m -o hello
结果报错:
/tmp/ccNFKMXF.o:在函数‘main’中:
/home/haipeng/projetcs/ios/hello.m:5:对‘objc_get_class’未定义的引用
/home/haipeng/projetcs/ios/hello.m:5:对‘objc_msg_lookup’未定义的引用
/home/haipeng/projetcs/ios/hello.m:5:对‘objc_msg_lookup’未定义的引用
/home/haipeng/projetcs/ios/hello.m:7:对‘NSLog’未定义的引用
/home/haipeng/projetcs/ios/hello.m:8:对‘objc_msg_lookup’未定义的引用
/tmp/ccNFKMXF.o:在函数‘__objc_gnu_init’中:
/home/haipeng/projetcs/ios/hello.m:10:对‘__objc_exec_class’未定义的引用
/tmp/ccNFKMXF.o:(.data.rel+0x0):对‘__objc_class_name_NSConstantString’未定义的引用
/tmp/ccNFKMXF.o:(.data.rel+0x8):对‘__objc_class_name_NSAutoreleasePool’未定义的引用
collect2: error: ld returned 1 exit status
上面的报错信息明显是链接错误,我检查了GNUstep的安装,有gnustep-base库。又搜索了其他相关文章,原来还依赖objc库,加上
gcc `gnustep-config --objc-flags` -lobjc -lgnustep-base hello.m -o hello
结果还是相同的错误。
该有的库都有了,还出错,想起gcc由来已久的feature:
GCC在链接时对依赖库的顺序是敏感的,被依赖的库必须放在后面,比如libfoo.a依赖libbar.a,必须写成-lfoo -lbar这样的顺序,否则链接将出错。
命令行调整成以下后问题解决。
gcc `gnustep-config --objc-flags` hello.m -o hello -lgnustep-base -lobjc
运行输出
haipeng@whp:~/projetcs/ios$ ./hello
2016-07-29 09:43:39.422 hello[4253] hello world
老外写的文章一样不让人放心呀。
Ubuntu下如何安装并使用objective-C:http://www.linuxdiyf.com/linux/16529.html