objective-c如何在linux下进入Modern模式
来源:互联网 发布:旺信淘宝新手交流群 编辑:程序博客网 时间:2024/06/06 01:25
自从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 cmakesudo apt-get install build-essential git subversion ninjasudo apt-get install libffi-dev libxml2-dev libgnutls-dev libicu-devsudo apt-get install libblocksruntime-dev libkqueue-devsudo apt-get install libpthread-workqueue-dev autoconf libtoolsudo apt-get install curlsudo apt-get install auto-aptsudo apt-get install libjpegsudo apt-get install libjpeg-dev libtiff-dev libpng12-devsudo apt-get install libcups2-dev libfreetype6-dev libcairo2-devsudo apt-get install libxt-dev libgl1-mesa-dev
- 然后安装clang和llvm
- 下载libobjc2(下载地址);编译命令如下:
echo "export CC=clang" >> ~/.bashrcecho "export CXX=clang++" >> ~/.bashrcsource ~/.bashrcexport CC=clangexport CXX=clang++cd libobjc2rm -rf buildmkdir buildcd buildcmake ..make debug=nosudo -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/clangCMake 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.cmakeCall 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.cmakeCall 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 llvmmkdir buildcd buildcmake ..
注意这里后面不需要make,我只要取得cmake生成的一系列*.cmake文件!最终将生成的文件拷贝到指定位置:
cd /usr/lib/llvm-3.5/share/llvm/cmakesudo cp /home/wisy/src/llvm/build/share/llvm/cmake/* .
再次进入libobjc2/build执行cmake ..,这回没有错误了。
接下来执行安装libobjc2库:
make debug=nosudo -E make install
5.下载libdispatch并安装:
git clone https://github.com/nickhutchinson/libdispatch.gitexport CC=clangexport CXX=clang++cd libdispatch./configuremakesudo -E make installsudo 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.6wisy@wisy-X120e:~/src/objc_src$ ./2Loading two versions of Protocol. The class that will be used is undefinedLoading two versions of Object. The class that will be used is undefined2015-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模式
- 如何在Terminal命令行模式下运行Objective-C
- linux下如何进入单用户模式
- linux下如何进入单人维护模式
- linux下如何进入root模式
- Modern Objective-C
- Modern Objective-C
- Modern Objective-C
- Adopting Modern Objective-C
- Adopting Modern Objective-C
- Adopting Modern Objective-C
- 在C:\WINDOWS\system32>下如何进入命令提示符
- 如何在没有密码的情况下进入Linux操作系统
- 在linux命令行下如何快速进入图形化界面
- 如何进入Linux单用户模式
- linux如何进入单用户模式
- linux 如何进入单用户模式
- 如何在ubuntu下搭建Objective-C开发环境
- 如何将bitmap进行缩放。这里说的是用画笔的方式。
- POJ 2393 Yogurt factory
- CSS代码缩写
- 关于scrollView滚动和sprite点击事件冲突的问题
- CentOS6.6 安全加固及性能优化
- objective-c如何在linux下进入Modern模式
- zigbee学习参考(1~42 )
- 在摄像头的设置中,最后三个参数的意义在于UP的方向设置。
- 动态网页爬取例子(WebCollector+selenium+phantomjs)
- ThreadPoolExecutor使用介绍
- gl.glPushMatrix(); 保护场景 gl.glPopMatrix(); 恢复场景
- 2015年第十四周oj刷题:
- Java中String类以及相关的类的学习
- ASP.Net使用jmail和System.Net.Mail发送邮件