Ubuntu安装GNUstep (Objective-C 2.0)

马肤
这是懒羊羊

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",说明配置成功。


文章版权声明:除非注明,否则均为VPS857原创文章,转载或复制请以超链接形式并注明出处。

发表评论

快捷回复:表情:
评论列表 (暂无评论,0人围观)

还没有评论,来说两句吧...

目录[+]

取消
微信二维码
微信二维码
支付宝二维码