如何在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  
时间: 2024-12-04 02:05:57

如何在linux上构建objective-c程序的相关文章

如何在Linux上构建 RAID 10阵列

如何在Linux上构建 RAID 10阵列 RAID 10阵列(又名RAID 1+0 或先镜像后分区)通过结合RAID 0 (读写操作在多个磁盘上同时并行执行)和RAID 1(数据被完全相同地写入到两个或更多的磁盘)两者的特点实现高性能和高容错性的磁盘I/O. 这篇文章会指导你如何使用五块相同的8GB磁盘来组成一个软件RAID 10阵列.因为组成一个RAID 10阵列至少需要4块磁盘(比如,两个镜像各有一对分区组合),而且需要添加一块额外的备用磁盘以防某块主要的磁盘出错.本文也会分享一些工具,在

如何在linux上分享你shell命令的输出

如何在linux上分享你shell命令的输出 前段时间我发布了一篇关于shelr.tv这个网站的文章,它提供一个服务允许你从网站上直接分享你的终端记录. 现在shelr.tv这个网站似乎关闭了,然后我四处寻找是否有类似的网站,于是我发现了commands.com. 从它的主页上来看,它的服务和其他网站提供的服务是类似的,因此让我们来测试它. 步骤 1 – 在网站上注册 只需要注册一个新的 用户名/密码,或者直接使用你的github账户快速登录. 步骤 2 – 下载安装monitor程序 Moni

Linux 有问必答:如何在 Linux 上安装 Node.js

Linux 有问必答:如何在 Linux 上安装 Node.js 问题: 如何在你的 Linux 发行版上安装 Node.js? Node.js 是建立在谷歌的 V8 JavaScript 引擎服务器端的软件平台上.在构建高性能的服务器端应用程序上,Node.js 在 JavaScript 中已是首选方案.是什么让使用 Node.js 库和应用程序的庞大生态系统来开发服务器后台变得如此流行.Node.js 自带一个被称为 npm 的命令行工具可以让你轻松地安装它,进行版本控制并使用 npm 的在

如何在 linux 上配置持续集成服务 - Drone

如何在 linux 上配置持续集成服务 - Drone 如果你对一次又一次的克隆.构建.测试和部署代码感到厌倦了,可以考虑一下持续集成.持续集成简称 CI,是一种像我们一样的频繁提交的代码库,构建.测试和部署的软件工程实践.CI 可以帮助我们快速的集成新代码到已有的代码库.如果这个过程是自动化进行的,那么就会提高开发的速度,因为这可以减少开发人员手工构建和测试的时间.Drone 是一个自由开源项目,用来提供一个非常棒的持续集成服务的环境,采用 Apache 2.0 协议发布.它已经集成近很多代码

LFCS 系列第一讲:如何在 Linux 上使用 GNU sed 等命令来创建、编辑和操作文件

LFCS 系列第一讲:如何在 Linux 上使用 GNU sed 等命令来创建.编辑和操作文件 Linux 基金会宣布了一个全新的 LFCS(Linux 基金会认证系统管理员Linux Foundation Certified Sysadmin)认证计划.这一计划旨在帮助遍布全世界的人们获得其在处理 Linux 系统管理任务上能力的认证.这些能力包括支持运行的系统服务,以及第一手的故障诊断.分析,以及为工程师团队在升级时提供明智的决策. Linux 基金会认证系统管理员--第一讲 请观看下面关于

如何在 Linux 上使用 Gmail SMTP 服务器发送邮件通知

如何在 Linux 上使用 Gmail SMTP 服务器发送邮件通知 假定你想配置一个 Linux 应用,用于从你的服务器或桌面客户端发送邮件信息.邮件信息可能是邮件简报.状态更新(如 Cachet).监控警报(如 Monit).磁盘时间(如 RAID mdadm)等等.当你要建立自己的 邮件发送服务器 传递信息时 ,你可以替代使用一个免费的公共 SMTP 服务器,从而避免遭受维护之苦. 谷歌的 Gmail 服务就是最可靠的 免费 SMTP 服务器 之一.想要从应用中发送邮件通知,你仅需在应用中

如何在 Linux 上安装服务器管理软件 Cockpit

如何在 Linux 上安装服务器管理软件 Cockpit Cockpit 是一个自由开源的服务器管理软件,它使得我们可以通过它好看的 web 前端界面轻松地管理我们的 GNU/Linux 服务器.Cockpit 使得 linux 系统管理员.系统维护员和开发者能轻松地管理他们的服务器并执行一些简单的任务,例如管理存储.检测日志.启动或停止服务以及一些其它任务.它的报告界面添加了一些很好的功能使得可以轻松地在终端和 web 界面之间切换.另外,它不仅使得管理一台服务器变得简单,更重要的是只需要一个

Linux有问必答 - 如何在linux上安装WPS

Linux有问必答 - 如何在linux上安装WPS 问题: 我听说一个好东西Kingsoft Office(译注:就是WPS),所以我想在我的Linux上试试.我怎样才能安装Kingsoft Office呢? Kingsoft Office 是一套办公套件,支持多个平台,包括Windows, Linux, iOS 和 Android.它包含三个组件:Writer(WPS文字)用来文字处理,Presentation(WPS演示)支持幻灯片,Spereadsheets(WPS表格)是电子表格.其使

Linux有问必答:如何在Linux上安装内核头文件

Linux有问必答:如何在Linux上安装内核头文件 提问:我在安装一个设备驱动前先要安装内核头文件.怎样安装合适的内核头文件? 当你在编译一个设备驱动模块时,你需要在系统中安装内核头文件.内核头文件同样在你编译与内核直接链接的用户空间程序时需要.当你在这些情况下安装内核头文件时,你必须确保内核头文件精确地与你当前内核版本匹配(比如:3.13.0-24-generic). 如果你的内核是发行版自带的内核版本,或者使用默认的包管理器的基础仓库升级的(比如:apt-ger.aptitude或者yum