如何在linux上构建objective-c程序
2023-09-14 08:56:51 时间
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- >
然后从中去除上述选项,然后再编译:
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- >
傻办法,不是吗?不过这回没问题啦.我们可以看到用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下手动构建PHP项目运行环境(lnmrp) 我之前在构建PHP项目运行环境,直接采用宝塔或者PHPstduy等一键集成安装工具,虽然操作简单,运营维护起来也方便.但是总觉得不自己手动安装一次,总感觉少点啥一样;所以今天,我们进行一次手动安装PHP运行环境并部署项目运行.
“Linux”不等同于Linux内核:构建Linux系统的8个软件包 Linux发行版并不仅仅是Linux内核。所有的Linux发行版都包含了除内核之外的一些必要的软件包,比如Grub引导程序、Bash shell、GNU shell工具软件、守护进程、X.org图形服务器和桌面环境等等。所有这些不同的程序均由相互独立的开发小组开发。这些程序被Linux发行版集成到一起从而形成一套完整的“Linux”操作系统。这和Windows操作系统不同,因为整个Windows系统全部由微软公司开发。
相关文章
- Linux中安装字体
- Linux 结束占用端口的程序
- [Linux]linux如何把文件切成多块
- linux基本信息查询
- CVE-2021-44228-Apache-Log4j-Rce漏洞反弹win&linux
- 【Linux基础】文件处理实例
- 利用 Linux tap/tun 虚拟设备写一个 ICMP echo 程序
- Linux命令行下如何终止当前程序
- qt creator:一款能够在windows/linux/mac系统上开发c程序的IDE
- Linux系统的运行级的概念
- linux学习之八---Linux进程基础知识
- Linux下如何查找可执行文件
- L66.linux命令每日一练 -- 第十章 Linux网络管理命令 -- arp和ip
- L62.linux命令每日一练 -- 第九章 Linux进程管理命令 -- strace和ltrace
- L51.linux命令每日一练 -- 第八章 Linux磁盘与文件系统管理命令 -- mkfs和dumpe2fs
- L34.linux命令每日一练 -- 第五章 Linux信息显示与搜索文件命令 -- echo和watch
- Windows10或Linux系统下手动移除Anaconda3安装的第三方库
- Linux内核中ideapad-laptop.c文件全解析3
- linux清除特定日期文件
- linux输入子系统
- 第十六章 linux-中断-softirq-tasklet-work queue
- 《Linux/Unix设计思想:软件的杠杆效应》读后感
- linux===给新手的 10 个有用 Linux 命令行技巧(转)
- ZYNQ - 嵌入式Linux开发 -08- linux应用程序开发
- 【Linux】之如何卸载干净zabbix服务?(超详细)
- Linux 探秘之用户态与内核态
- Linux查看硬件配置-cpu内存磁盘网卡
- 使用wget批量下载geo数据集的全部文件 linux下载geo数据 geo处理的数据不是下载原始数据 Linux如何下载ftp文件 geo ftp geo ftp下载 geo下载