objective-c如何在linux下进入Modern模式
自从apple的obj-c进入2.0后,出现了相对于Legacy模式的Modern模式;Modern模式中出现了一些高级功能(比如ARC),并且出现了一些新的字面语法,新旧模式的差别可以参考apple官方的:
two Platforms 参考文档
在linux中(以下均以ubuntu 15.04为例),默认的clang以及gnustep是不支持Modern模式的;需要清楚的是Modern必须由libobjc2以及libgnustep-base.so同时支持才可以实现。
所以我们必须在系统安装libobjc2和对应的libgnustep-base.so。
- 确保系统处于“全新”状态,所谓的“全新”是指没有安装过任何llvm,clang尤其是gnustep的任何文件。如果以前安装过的化必须全部清除干净。/usr/local/lib和/usr/lib中不能残留任何libgnustep*的库
- 先密集安装所需的库吧(有些是可选项):
sudo apt-get install cmake
sudo apt-get install build-essential git subversion ninja
sudo apt-get install libffi-dev libxml2-dev libgnutls-dev libicu-dev
sudo apt-get install libblocksruntime-dev libkqueue-dev
sudo apt-get install libpthread-workqueue-dev autoconf libtool
sudo apt-get install curl
sudo apt-get install auto-apt
sudo apt-get install libjpeg
sudo apt-get install libjpeg-dev libtiff-dev libpng12-dev
sudo apt-get install libcups2-dev libfreetype6-dev libcairo2-dev
sudo apt-get install libxt-dev libgl1-mesa-dev
- 然后安装clang和llvm
- 下载libobjc2(下载地址);编译命令如下:
echo "export CC=clang" >> ~/.bashrc
echo "export CXX=clang++" >> ~/.bashrc
source ~/.bashrc
export CC=clang
export CXX=clang++
cd libobjc2
rm -rf build
mkdir build
cd build
cmake ..
make debug=no
sudo -E make install
实际执行中发现在cmake ..这一步发生错误,错误日志如下:
-- The C compiler identification is Clang 3.5.0
-- The CXX compiler identification is Clang 3.5.0
-- Check for working C compiler: /usr/bin/clang
-- Check for working C compiler: /usr/bin/clang -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/clang++
-- Check for working CXX compiler: /usr/bin/clang++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- The ASM compiler identification is Clang
-- Found assembler: /usr/bin/clang
CMake Error at /usr/share/llvm-3.5/cmake/LLVMConfig.cmake:50 (include):
include could not find load file:
/usr/lib/llvm-3.5/share/llvm/cmake/LLVMExports.cmake
Call Stack (most recent call first):
CMakeLists.txt:129 (find_package)
CMake Error at /usr/share/llvm-3.5/cmake/LLVMConfig.cmake:53 (include):
include could not find load file:
/usr/lib/llvm-3.5/share/llvm/cmake/LLVM-Config.cmake
Call Stack (most recent call first):
CMakeLists.txt:129 (find_package)
-- Untested version of LLVM (3.5.0) found.
-- Disabling LLVM options unless explicitly enabled.
-- No C++ runtime library found
-- Looking for include file pthread.h
-- Looking for include file pthread.h - found
-- Looking for pthread_create
-- Looking for pthread_create - not found
-- Looking for pthread_create in pthreads
-- Looking for pthread_create in pthreads - not found
-- Looking for pthread_create in pthread
-- Looking for pthread_create in pthread - found
-- Found Threads: TRUE
-- GNUstep install type set to LOCAL
-- Configuring incomplete, errors occurred!
See also "/home/wisy/src/libobjc2/build/CMakeFiles/CMakeOutput.log".
See also "/home/wisy/src/libobjc2/build/CMakeFiles/CMakeError.log".
不需要到CMakeFiles目录中去看CMakeError.log,其实出错原因上面已经说的很清楚了,解决办法却没那么简单,直接做软链接还是会出错,以下是我的解决办法:首先下载llvm:
svn co http://llvm.org/svn/llvm-project/llvm/trunk llvm
然后执行cmake:
cd llvm
mkdir build
cd build
cmake ..
注意这里后面不需要make,我只要取得cmake生成的一系列*.cmake文件!最终将生成的文件拷贝到指定位置:
cd /usr/lib/llvm-3.5/share/llvm/cmake
sudo cp /home/wisy/src/llvm/build/share/llvm/cmake/* .
再次进入libobjc2/build执行cmake ..,这回没有错误了。
接下来执行安装libobjc2库:
make debug=no
sudo -E make install
5.下载libdispatch并安装:
git clone https://github.com/nickhutchinson/libdispatch.git
export CC=clang
export CXX=clang++
cd libdispatch
./configure
make
sudo -E make install
sudo ldconfig
这时如果用Modern模式编译objc代码会出现警告,而且执行时也会有警告提示:
clang `gnustep-config --objc-flags` -g0 -O3 -s -fobjc-arc -fobjc-nonfragile-abi -fblocks -lobjc -ldispatch -lgnustep-base -lgnustep-gui `gnustep-config --objc-libs` -o 2 2.mclang: warning: argument unused during compilation: '-shared-libgcc'
/usr/bin/ld: warning: libobjc.so.4, needed by /usr/lib/libgnustep-base.so, may conflict with libobjc.so.4.6
/usr/bin/ld: warning: libobjc.so.4, needed by /usr/lib/libgnustep-base.so, may conflict with libobjc.so.4.6
wisy@wisy-X120e:~/src/objc_src$ ./2
Loading two versions of Protocol. The class that will be used is undefined
Loading two versions of Object. The class that will be used is undefined
2015-06-11 10:47:20.474 2[21119] (1, hi, 121)
因为libgnustep-base.so还在用老版本的libobjc.so库,所以需要重新编译链接libgnustep-base.so.
6.下载libgnustep-base;这个在configure后,make出错,链接时报大量的符号找不到定义。后来没办法,下载gnustep:
svn co http://svn.gna.org/svn/gnustep/modules/core
然后进入core/scripts目录,执行:
./compile-all
最后在/usr/lib中会出现最新的libgnustep-base.so
如果./compile-all没有生成.so文件则建议依次到base和gui目录中去单独编译。到这里基本上OK了,可以用以下命令行编译:
clang `gnustep-config --objc-flags` -g0 -O3 -s -fobjc-arc -fobjc-nonfragile-abi -fblocks -lobjc -ldispatch -lgnustep-base -lgnustep-gui `gnustep-config --objc-libs` -I/usr/include/GNUstep/ -I/usr/local/include/GNUstep/ -o 9 9.m
可以参考老外写的详细安装日志,但我具体实现下来貌似一些步骤无法实现:
https://feloneouscat.wordpress.com/2013/10/25/objective-c-on-ubuntu-12-04-with-blocks-and-arc/
objective-c如何在linux下进入Modern模式的更多相关文章
- 一步一步教你如何在linux下配置apache+tomcat(转)
一步一步教你如何在linux下配置apache+tomcat 一.安装前准备. 1. 所有组件都安装到/usr/local/e789目录下 2. 解压缩命令:tar —vxzf 文件名(. ...
- 如何在Linux下拷贝一个目录呢
cp -af newadmin/movie/. uploadfile/mallvideo/ 如何在Linux下拷贝一个目录呢?这好像是再简单不过的问题了. 比如要把/home/usera拷贝到/m ...
- 如何在linux下制作一个windows的可启动u盘?
如何在linux下制作一个windows的可启动u盘? 情景是这样的,有一个windows10的iso,现在想通过U盘安装,要求即支持UEFI(启动引导器),又支持Legacy(启动引导器),因为有一 ...
- 如何在linux下开启FTP服务
如何在linux下开启FTP服务 1. 首先服务器要安装ftp软件,查看是否已经安装ftp软件下: #which vsftpd 如果看到有vsftpd的目录说明服务器已经安装了ftp软件 2. ...
- 如何在Linux下禁用IPv6
如何在Linux下禁用IPv6 echo 1 > /proc/sys/net/ipv6/conf/all/disable_ipv6 禁用IP ...
- 如何在Linux下使用Rsync
如何在Linux下使用Rsync 吐槽 昨天对scp进行总结之后看到最后有说到Rsync,俗语有云:好奇心害死猫.抱着学习的态度将Rsync给找了出来,然后进行了一些简单的学习.下面介绍一些个常用的命 ...
- Dcloud课程6 php脚本如何在Linux下定时更新数据
Dcloud课程6 php脚本如何在Linux下定时更新数据 一.总结 一句话总结:linux下用crontab命令实现定时任务. 1.linux下执行php脚本用什么命令? 直接用php命令php ...
- 如何在Linux下安装Tomcat
上篇文章写到了Linux下安装JDK1.8,这篇文章详细阐述一下 如何在Linux下安装Tomcat!!!有啥问题可以留言,博主每天都会看博客的. 准备步骤和方法和以前一样,博主用的工具是XShell ...
- 如何在Linux下安装JDK1.8
本文会详细介绍如何在Linux下安装JDK1.8 首先要设置虚拟机的IP地址,不知道如何设置的话可以 翻看我的前一篇博客 http://www.cnblogs.com/xiaoxiaoSMILE/ ...
随机推荐
- Sharing The Application Tier File System in Oracle E-Business Suite Release 12.2
The most current version of this document can be obtained in My Oracle Support Knowledge Document 13 ...
- GDB调试工具入门
从windows转到linux下已经有一段时间了,每次刷算法题碰到问题需要调试的时候,就分分钟想关机,切换到windows上调试.于是,花了一点时间来搜索一下linux下常见的调试工具,这不搜不知道, ...
- CentOS一般用户和root用户之间的切换
如果终端提示符显示为"$",表明该用户为普通用户.输入su,回车,然后输入root密码,即可切换到root用户.如果是root用户想切换回普通用户,输入"su 用户名&q ...
- 动手实现linux中的cp命令(可自行拓展)
我们在学习系统编程的时候,一定会有这样的经历,让你动手实现一个简单的cp命令,也就是拷贝相应的文件到对应的目录,或者说是复制吧,当然,实现非常的简单,我们来看看源码吧: #include <st ...
- Android初级教程小案例之单选框RadioGroup与复选框CheckBox
Android里面的单选框和html中的其实是一样的效果.这里用到两个控件:CheckBox和RadioGroup.直接上代码: radio.xml布局文件: <?xml version=&qu ...
- Socket编程实践(10) --select的限制与poll的使用
select的限制 用select实现的并发服务器,能达到的并发数一般受两方面限制: 1)一个进程能打开的最大文件描述符限制.这可以通过调整内核参数.可以通过ulimit -n(number)来调整或 ...
- Android项目-高考作文-使用ORMLite抽象公共的Dao层
1, 定义统一的Dao接口 public interface IDao<T> { public abstract T getSingleById(int id); public abstr ...
- SpringMVC项目中启动自加载Listener
package com.kuman.cartoon.listener; import java.util.List; import org.springframework.beans.factory. ...
- DB 查询分析器 方便地创建DB2自定义函数
DB 查询分析器 方便地创建DB2自定义函数 马根峰 (广东联合电子服务股份有限公司, 广州 510300) 摘要 ...
- org/w3c/dom/ElementTraversal 错误解决办法
org/w3c/dom/ElementTraversal 错误解决办法 不记得之前几天把什么maven依赖包删除了,今天利用htmlunit运行代码的时候报了下面的错误: Exception in t ...