GNUstep是Objective C库和框架的开源实现,它使得我们可以在Linux系统上使用Objective C。Objective C有1.0和2.0版本,在Ubuntu上如果直接用apt-get安装gnustep组件,安装的会是1.0版本,会造成autoreleasepool等2.0版本的功能无法使用,给开发造成很大的不便。要想使用2.0版本,就必须下载源码,编译安装。这篇文章记录了在Ubuntu系统上安装支持Objective-C 2.0版本的GNUstep的过程。
系统环境:Ubuntu 20.04 x86_64
1. 卸载所有原有的gnustep组件。如果之前的环境是用apt-get安装的,就要用apt-get卸载掉,确保系统中没有gnustep*和libgnustep*的软件包。(这一步参考:objective-c如何在linux下进入Modern模式_clang gnustep-CSDN博客,但clang和llvm可以不卸载)
2. 如果没有安装clang和llvm,可使用apt命令安装:
sudo apt install clang sudo apt install llvm
3. 安装软件包:
sudo apt install cmake sudo apt install libffi-dev libicu-dev libgnutls28-dev libxml2-dev sudo apt install libpthread-workqueue-dev libblocksruntime-dev libkqueue-dev libfreetype6-dev sudo apt install libjpeg-dev libcups2-dev libpng-dev libfreetype-dev sudo apt install libxt-dev libcairo2-dev libgl1-mesa-dev
4. 从github下载所需源码(要到Release中下载,确保版本正确)
robin-map-1.2.2: Release v1.2.2 · Tessil/robin-map · GitHub
libobjc2-2.2.1: Release GNUstep Objective-C Runtime 2.2.1 · gnustep/libobjc2 · GitHub
gnustep-base-1.29.0: https://github.com/gnustep/libs-base/releases/tag/base-1_29_0
gnustep-make-2.9.1: Release make-2_9_1 · gnustep/tools-make · GitHub
gnustep-gui-0.30.0: https://github.com/gnustep/libs-gui/releases/tag/gui-0_30_0
5. 安装robin-map
解压后进入目录,执行:
mkdir build cd build cmake .. make sudo make install
6. 安装libobjc2
安装方法同上。
7. 依次安装gnustep-make,gnustep-base和gnustep-gui,都是configure->make->sudo make install三部曲。
中间如果报找不到libgnustep-base.so.1.29,就添加软链接:
sudo ln -s /usr/local/lib/libgnustep-base-so.1.29 /usr/lib
添加完成后,把刚才报错的指令重新执行一次,就应该能通过了。通过这一步后继续安装,直到完成。
8. 在~/.profile中添加:
. /usr/local/share/GNUstep/Makefiles/GNUstep.sh
9. 使配置文件生效
source ~/.profile
环境配置完成,最好重启一下,再写项目。
测试项目:helloworld
GNUmakefile:
include $(GNUSTEP_MAKEFILES)/common.make TOOL_NAME = helloworld helloworld_OBJC_FILES = helloworld.m OBJC_ADDITIONAL_FLAGS = -fobjc-exceptions -fobjc-nonfragile-abi -ldispatch include $(GNUSTEP_MAKEFILES)/tool.make
helloworld.m:
#import int main(int argc, const char* argv[]) { @autoreleasepool { NSLog(@"Hello world!\n"); } return 0; }
这个项目可以编译运行,说明Objective-C 2.0环境配置成功。
补充:我们还可以通过检测__OBJC2__宏的方式检测Objective-C版本:
GNUmakefile:
include $(GNUSTEP_MAKEFILES)/common.make TOOL_NAME = objc_version_detect objc_version_detect_OBJC_FILES = objc_version_detect.m OBJC_ADDITIONAL_FLAGS = -fobjc-nonfragile-abi -fobjc-arc include $(GNUSTEP_MAKEFILES)/tool.make
objc_version_detect.m:
#import int main(int argc, const char* argv[]) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; double objcVer = -1; #ifdef __OBJC2__ objcVer = 2; #elif defined(__OBJC__) objcVer = 1; #else objcVer = 0; #endif NSLog(@"The Objective-C version is %2.1f\n", objcVer); [pool release]; return 0; }
编译运行,显示"The Objective-C version is 2.0",说明配置成功。
还没有评论,来说两句吧...