如何在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 ...
随机推荐
- Swift基础之设计折线坐标图
最近添加了折线视图的样式,所以在这里用Swift语言重新再使用设计一下 首先设置纵坐标的数值是:体重 //体重 let weightLabel = UILabel.init(frame: ...
- UNIX网络编程——信号驱动式I/O
信号驱动式I/O是指进程预先告知内核,使得当某个描述符上发生某事时,内核使用信号通知相关进程. 针对一个套接字使用信号驱动式I/O,要求进程执行以下3个步骤: 建立SIGIO信号的信号处理函数. 设置 ...
- J2EE进阶(六)SSH框架工作流程项目整合实例讲解
J2EE进阶(六)SSH框架工作流程项目整合实例讲解 请求流程 经过实际项目的进行,结合三大框架各自的运行机理可分析得出SSH整合框架的大致工作流程. 首先查看一下客户端的请求信息: 对于一个Web项 ...
- Ubuntu 13.04设置root用户登录图形界面
先切换到root用户, sudo su root 1.先设定一个root的密码, passwd root 2.备份一下lightgdm cp -p /etc/lightdm/lightdm.conf ...
- pig强制转换(字符到整数):首位0怎么处理,‘01’到1的转化,
pig支持的类型转换(cast) Pig Latin supports casts as shown in this table. from / to bag tuple map int long f ...
- pig函数以及关键字 的一些实例应用的总结(来自pig笔记)
http://wenku.baidu.com/link?url=yb7KnpSj9nHxWk_MsEVUezvB24evRf9wR87FX0dTT77pGXNXi6k3o_kTmAkBrpIHTqo6 ...
- 【Android 应用开发】 FastJson 使用详解
博客地址 :http://blog.csdn.net/shulianghan/article/details/41011605 fastjson 源码地址 : -- GitHub : https:// ...
- Java进阶(二十七)使用Dom4j解析XML文件
使用Dom4j解析XML文件 写在前面的话 由于论文实验要求,需要实现操作XML文档,为此想到了dom4j这个工具,使用之后深感受益.在此分享给大家,以此共勉. 注:本文转载自http://blog. ...
- JAVA之旅(八)——多态的体现,前提,好处,应用,转型,instanceof,多态中成员变量的特点,多态的案例
JAVA之旅(八)--多态的体现,前提,好处,应用,转型,instanceof,多态中成员变量的特点,多态的案例 学习是不能停止的 一.多态 我们今天又要学习一个新的概念了,就是多态,它是面向对象的第 ...
- android官方技术文档翻译——Case 标签中的常量字段
本文译自androd官方技术文档<Non-constant Fields in Case Labels>,原文地址:http://tools.android.com/tips/non-co ...