如何在linux上构建objective-c程序
swfit目前还是os x独占,以后会不会扩展到其他系统还未可知,但objective-c并不只存在于os x,在linux下gcc和clang都支持obj-c哦,下面简单把如何在ubuntu上构建obj-c做一下说明:
1 安装obj-c或obj-c++(如果需要的话)所需库:
* build-essential
* gobjc
* gobjc++
* gnustep-devel
直接用apt-get install 搞定吧 :)
2 用经典的hello world试一下吧:
- #import <Foundation/Foundation.h>
- int main (int argc, const char * argv[])
- {
- @autoreleasepool
- {
- printf("Hello, World!\n");
- NSLog(@"Hello, Objective-C!");
- }
- return 0;
- }
- wisy@wisy-ThinkPad-X61:~/src/objc_src$ gcc t.m $(gnustep-config --objc-flags) -lgnustep-base -o tgcc
- /usr/bin/ld: /tmp/cc1azE8Z.o: undefined reference to symbol 'objc_msg_lookup'
- //usr/lib/x86_64-linux-gnu/libobjc.so.4: error adding symbols: DSO missing from command line
- collect2: error: ld returned 1 exit status
神马情况,肿么出错鸟?看出错代码明显是少了链接库文件,度娘搜之,发现少链了 objc 库,加上则通过:
- wisy@wisy-ThinkPad-X61:~/src/objc_src$ gcc t.m $(gnustep-config --objc-flags) -lobjc -lgnustep-base -o tgcc
我们再试试clang:
- wisy@wisy-ThinkPad-X61:~/src/objc_src$ clang t.m $(gnustep-config --objc-flags) -lobjc -lgnustep-base -o t
- clang: error: unknown argument: '-fexec-charset=UTF-8'
貌似又不能通过,未知参数啊!那么我们暂且将该参数从列表中去掉再试试吧:首先展开gnustep-config --objc-flags列表,
- wisy@wisy-ThinkPad-X61:~/src/objc_src$ gnustep-config --objc-flags
- -MMD -MP -DGNUSTEP -DGNUSTEP_BASE_LIBRARY=1 -DGNU_GUI_LIBRARY=1 -DGNU_RUNTIME=1 -DGNUSTEP_BASE_LIBRARY=1 -fno-strict-aliasing -fexceptions -fobjc-exceptions -D_NATIVE_OBJC_EXCEPTIONS -pthread -fPIC -Wall -DGSWARN -DGSDIAGNOSE -Wno-import -g -O2 -fgnu-runtime -fconstant-string-class=NSConstantString -fexec-charset=UTF-8 -I. -I/home/wisy/GNUstep/Library/Headers -I/usr/local/include/GNUstep -I/usr/include/GNUstep
然后从中去除上述选项,然后再编译:
- wisy@wisy-ThinkPad-X61:~/src/objc_src$ clang t.m -O3 -g0 -MMD -MP -DGNUSTEP -DGNUSTEP_BASE_LIBRARY=1 -DGNU_GUI_LIBRARY=1 -DGNU_RUNTIME=1 -DGNUSTEP_BASE_LIBRARY=1 -fno-strict-aliasing -fexceptions -fobjc-exceptions -D_NATIVE_OBJC_EXCEPTIONS -pthread -fPIC -Wall -DGSWARN -DGSDIAGNOSE -Wno-import -g -O2 -fgnu-runtime -fconstant-string-class=NSConstantString -I. -I/home/wisy/GNUstep/Library/Headers -I/usr/local/include/GNUstep -I/usr/include/GNUstep -lobjc -lgnustep-base -o t
傻办法,不是吗?不过这回没问题啦.我们可以看到用clang生成的可执行文件比gcc生成的将近大一倍,具体什么原因初学的我还不清楚哦.
另外一个要注意的是,gcc和clang虽然都可以编译obj-c代码,但是具体看来可能会有差异,比如以下代码,在gcc中无法编译通过:
- @autoreleasepool {
- NSLog(@"hello apple! :)");
- }
会报如下错误:
- wisy@wisy-ThinkPad-X61:~/src/objc_src$ gcc t.m $(gnustep-config --objc-flags) -lobjc -lgnustep-base -o tgcct.m: In function ‘main’:
- t.m:5:2: error: stray ‘@’ in program
- @autoreleasepool {
- ^
- t.m:5:3: error: ‘autoreleasepool’ undeclared (first use in this function)
- @autoreleasepool {
- ^
- t.m:5:3: note: each undeclared identifier is reported only once for each function it appears in
- t.m:5:19: error: expected ‘;’ before ‘{’ token
- @autoreleasepool {
- ^
但是clang中是没有问题的,原因仍然未知 :(
如果是在os x上用clang编译,可以用以下命令:
- clang -fobjc-arc -framework Foundation x.m -o test
如何在linux上构建objective-c程序的更多相关文章
- 如何在 Linux 上安装应用程序
如何在 Linux 上安装应用程序 编译自:https://opensource.com/article/18/1/how-install-apps-linux作者: Seth Kenlon原创:LC ...
- 如何在Linux上使用VIM进行.Net Core开发
对于在Linux上开发.Net Core的程序员来说, 似乎都缺少一个好的IDE. Windows上有Visual Studio, Mac上有Visual Studio for Mac, 难道Linu ...
- 如何在Linux上通过grub添加内核参数
转自Linux中国 我们可以在linux内核启动时为其提供各种各样的参数.这些参数可以自定义内核默认的行为,或者通知内核关于硬件的配置信息.内核参数应在内核启动时通过引导装载程序,如GRUB或LILO ...
- 如何在 Linux 上复制文件/文件夹到远程系统?
从一个服务器复制文件到另一个服务器,或者从本地到远程复制是 Linux 管理员的日常任务之一. 我觉得不会有人不同意,因为无论在哪里这都是你的日常操作之一.有很多办法都能处理这个任务,我们试着加以概括 ...
- springboot打成的jar包如何在Linux上持久运行
一.首先说说在没有springboot的时候,项目是如何部署的? 1.动态web项目 动态web项目部署很方便,基本上上传文件到服务器的tomcat里面的webapps文件夹下即可完成部署.当然了,这 ...
- 如何在Linux上清理内存缓存、缓冲与交换空间
如何在Linux上清理内存缓存.缓冲与交换空间 与其他类型的操作系统一样,GNU/Linux已经有效的实现了内存管理,甚至更加优秀.但是如果任何进程正在吃光你的内存,并且你想清理它,Linux提供了一 ...
- 从Azure上构建Windows应用程序映像
从Azure上构建windows应用程序映像同构建Linux应用程序映像总体流程比较类似,可以参考上图Linux映像的制作发布等流程,具体细节又有所差别. 具体步骤如下: 从Azure管理平台上申请W ...
- 使用VS GDB扩充套件在VS上远端侦错Linux上的C/C++程序
在 Linux 上开发 C/C++ 程序,或许你会直接(本机或远端)登入 Linux,打开编辑器写完代码后,就用 gcc/g++ 来编译,遇到要除错(debug)的时候,则会选择使用 gdb 来进行除 ...
- 如何在 Linux 上设置密码策略
https://linux.cn/article-2518-1.html 用户帐号管理是系统管理员最重要的工作之一.而密码安全是系统安全中最受关注的一块.在本教程中,我将为大家介绍如何在 Linux ...
随机推荐
- SSH框架实现仿淘宝购物demo
还记得六月份实习的时候,曾经做过一个电商的项目,项目里面需要实现类似淘宝购物车的移动端的demo,随着项目的进行,再一次跟购物车碰面,但是今天呢,不是移动端的需求,如何使用SSH框架实现类似淘宝的购物 ...
- 剑指offer面试题6 重建二叉树(c)
- MySQL设计软件登录模块
学了一段时间的Java了,思量着做一点简单的小模块的东西吧,于是就有了下面的这个简单的小案例. 大致实现的功能就是注册于登录还有就是用到了一点,分层思想.仅此而已,所以非常的适合新手围观. 建立好数据 ...
- Android开发工具下载地址
Android Studio: http://zdz.la/iq4zSa
- Fedora 20: How to enable SSH
1. systemctl enable sshd.service 2. service sshd restart
- Xcode中Groups和Folder的区别
以前一直没有在意这个问题,今天"中奖"了 ;( 在Xcode文件夹视图中会发现2种颜色的文件夹图标:黄色和蓝色. 黄色表示组(groups),蓝色表示文件夹(folder). 组只 ...
- Rational Rose正逆向工程(类图转Java代码,Java代码转类图)
一,正向工程 1.设置默认语言为Java,Tools->Options->Notation->default:选择Java. 2.设置环境变量Class ...
- Mybatis源码分析之结果封装ResultSetHandler和DefaultResultSetHandler
ResultSetHandler负责处理两件事: (1)处理Statement执行后产生的结果集,生成结果列表 (2)处理存储过程执行后的输出参数ResultSetHandler是一个接口,提供了两个 ...
- ADO.NET之Parameter属性
在ADO.NET中, public SqlParameterCollection Parameters {get;}会得到一个SqlParameter属性.下面通过一个例子进行详细的认识吧. //例如 ...
- 1025. PAT Ranking (25)
题目如下: Programming Ability Test (PAT) is organized by the College of Computer Science and Technology ...