如何在MacOSX 10.12上编译STUTTER lang
我现在正在翻阅加里·W·弗莱克(Gary W Flake)的超级好书《自然的计算之美》,他在书中介绍了。我正在尝试在MacOSX 10.12.6上安装它 TL;DR:最终解决方案是: 编辑stutter/Makefile和shell/Makefile,并用-g wheel或-g sys替换-g root的所有实例 运行以下命令sudo是必需的: sudo IA64=1 CFLAGS='-std=gnu89'前缀=/usr/local make install 请参阅下面的原始问题,并阅读rici的答案,以了解为什么必须这样设置CFLAGS 如安装文件中所述,唯一的依赖项是:gcc、gnumake、shell的libreadline dev和可选sqlite模块的libsqlite3 dev。我确保它们是使用自制软件安装的,确切地说,我有: gcc 9.1.0通过gcc获得-版本 make 3.81通过make获得-版本 readline 8.0.1通过brew安装readline获得,并使brew输出已安装的版本 sqlite 3.30.1通过brew安装sqlite 3获得,并使brew输出已安装的版本 安装失败,跟踪如下: Guillaume@Guillaumes-MacBook Pro:~/Downloads/stutter-0.16$make-install cd stutter&make安装 cc-g-Wall-DVERSION=\0.16 \-DREFPATH=\/usr/share/stutter \-I/usr/local/opt/readline/include-c-o read.o read.c 在read.c:7中包含的文件中: 包含在文件中的./builtins.h:5: ./memory.h:29:14:警告:未定义内联函数“xcalloc” [-Wundefined内联] 内联void*xcallocize\u t nmemb,size\u t size; ^ 阅读。c:15:18:注:此处使用 read_state*s=xcaloc1,sizeofrad_state; ^ 在read.c:7中包含的文件中: 包含在文件中的./builtins.h:5: ./memory.h:31:14:警告:未定义内联函数“xmalloc” [-Wundefined内联] 内联void*xmallocsize\u t大小; ^ 阅读。c:54:23:注:此处使用 s->token=char*xmalloc8; ^ 在read.c:7中包含的文件中: 包含在文件中的./builtins.h:5: ./memory.h:33:14:警告:未定义内联函数“xrealloc” [-Wundefined内联] 内联空隙*xreallocvoid*ptr,尺寸\u t尺寸; ^ 阅读。c:62:24:注:此处使用 s->token=char*xreallocs->token,s->buflen*=2; ^ 生成3个警告。 cc-g-Wall-DVERSION=\0.16 \-DREFPATH=\/usr/share/stutter \-I/usr/local/opt/readline/include-c-o-types.o-types.c 在类型中包含的文件中。c:10: ./memory.h:29:14:警告:未定义内联函数“xcalloc” [-Wundefined内联] 内联void*xcallocize\u t nmemb,size\u t size; ^ 类型c:56:23:注:此处使用 如果o o=s_obj*xcaloc1,尺寸f_obj; ^ 在类型中包含的文件中。c:10: ./memory.h:31:14:警告:未定义内联函数“xmalloc” [-Wundefined内联] 内联void*xmallocsize\u t大小; ^ 类型.c:151:31:注:此处使用 o->d.string.value=char*xmalloclen+1; ^ 在类型中包含的文件中。c:10: ./memory.h:33:14:警告:未定义内联函数“xrealloc” [-Wundefined内联] 内联空隙*xreallocvoid*ptr,尺寸\u t尺寸; ^ 类型c:1013:26:注:此处使用 typedb=typeinfo*xrealloctypedb,typedb\u si。。。 ^ 在类型中包含的文件中。c:12: ./builtins.h:113:12:警告:未定义内联函数“nextparm” [-Wundefined内联] 内联int nextparms_obj**obj,s_obj**parm; ^ 类型.c:1378:8:注:此处使用 当ExtrenparM&o和iter{ ^ 生成4个警告。 cc-g-Wall-DVERSION=\0.16 \-DREFPATH=\/usr/share/stutter \-I/usr/local/opt/readline/include-c-o memory.o memory.c memory.c:160:18:警告:从 较小的整数类型“int”[-Wint到指针强制转换] gc_protect_rootvarctx*ptrintobj|1; ^ memory.c:166:20:警告:从 较小的整数类型“int”[-Wint到指针强制转换] gc_unprotect_rootvarctx*ptrintobj|1; ^ memory.c:474:16:警告:从较小的值转换为's_obj*'或'struct s_obj*' 整数类型“int”[-Wint到指针强制转换] gc_mark_objs_obj*ptrint p->root^1; ^ 生成3个警告。 cc-g-Wall-DVERSION=\0.16 \-DREFPATH=\/usr/share/stutter \-I/usr/local/opt/readline/include-c-o eval.o eval.c 在eval.c中包含的文件中:8: ./builtins.h:113:12:警告:未定义内联函数“nextparm” [-Wundefined内联] 内联int nextparms_obj**obj,s_obj**parm; ^ 评估c:130:9:注:此处使用 而extparm&i和parm{ ^ 在eval.c中包含的文件中:5: 档案公司 从中排除。/eval.h:10: ./memory.h:138:13:警告:未定义内联函数“gc\u protlist\u add” [-Wundefined内联] 内联void gc_protlist_添加_obj*obj; ^ 评估c:138:4:注:此处使用 gc_protlist_addo; ^ 在eval.c中包含的文件中:5: 包含在文件中的./eval.h:10: ./memory.h:31:14:警告:未定义内联函数“xmalloc” [-Wundefined内联] 内联void*xmallocsize\u t大小; ^ 评估c:1087:24:注:此处使用 compx*cx=compx*xmallocsizeofcompx; ^ 生成3个警告。 cc-g-Wall-DVERSION=\0.16 \-DREFPATH=\/usr/share/stutter \-I/usr/local/opt/readline/include-c-o builtins.o builtins.c 在builtins.c:56中包含的文件中: 包含在文件中的./stutter.h:5: ./memory.h:31:14:警告:未定义内联函数“xmalloc” [-Wundefined内联] 内联void*xmallocsize\u t大小; ^ 内置。c:513:18:注:此处使用 p=char*xmallocstrlenobj->d.symbo。。。 ^ 在builtins.c:56中包含的文件中: 包含在文件中的./stutter.h:5: ./memory.h:33:14:警告:未定义内联函数“xrealloc” [-Wundefined内联] 内联空隙*xreallocvoid*ptr,尺寸\u t尺寸; ^ 内置。c:856:21:注:此处使用 str=char*xreallocstr,stra; ^ 在builtins.c:56中包含的文件中: 包含在文件中的./stutter.h:5: ./memory.h:29:14:警告:未定义内联函数“xcalloc” [-Wundefined内联] 内联void*xcallocize\u t nmemb,size\u t size; ^ 内置。c:2025:11:注:此处使用 *数据=xcaloc1,8+2*sizeofint; ^ 生成3个警告。 cc-g-Wall-DVERSION=\0.16 \-DREFPATH=\/usr/share/stutter \-I/usr/local/opt/readline/include-c-o mathbuiltins.o mathbuiltins.c 在mathbuiltins.c中包含的文件中:5: ./builtins.h:116:12:警告:未定义内联函数“nextarg” [-Wundefined内联] 内联int nextargvarctx*ctx,s_obj**obj,s_obj**parm; ^ mathbuiltins.c:14:6:注:此处使用 如果nextargctx、obj和parm ^ 生成1个警告。 cc-g-Wall-DVERSION=\0.16 \-DREFPATH=\/usr/share/stutter \-I/usr/local/opt/readline/include-c-o sforms.o sforms.c 在sforms.c中包含的文件中:2: 包含在文件中的./stutter.h:7: ./builtins.h:113:12:警告:未定义内联函数“nextparm” [-Wundefined内联] 内联int nextparms_obj**obj,s_obj**parm; ^ sforms.c:27:6:注:此处使用 如果nextparm&prm和parm ^ 在sforms.c中包含的文件中:2: 包含在文件中的./stutter.h:7: ./builtins.h:116:12:警告:未定义内联函数“nextarg” [-Wundefined内联] 内联int nextargvarctx*ctx,s_obj**obj,s_obj**parm; ^ sforms.c:166:7:注:此处使用 如果nextargctx、obj和asg{ ^ 在sforms.c中包含的文件中:2: 包含在文件中的./stutter.h:5: ./memory.h:29:14:警告:未定义内联函数“xcalloc” [-Wundefined内联] 内联void*xcallocize\u t nmemb,size\u t size; ^ sforms.c:388:47:注:此处使用 方法->d.clos\u method.args=method\u arg*xcalocargn。。。 ^ 生成3个警告。 cc-shared-o libstutter-0.16.so read.o types.o memory.o eval.o builtins.o mathbuilins.o sforms.o-L/usr/local/opt/readline/lib-lm 架构x86_64的未定义符号: _gc_如下,引用自: _内存中的gc_mark_obj.o _内存中的gc_标记 _gc_收获,参考自: _在内存中进行gc_扫描 _gc_protlist_add,引用自: _内存中的gc_记录。o _评估中的funcexec _nextarg,引用自: _下一个是内置的 _sb_安装在内置设备中 _sb_安装在内置设备中 _某人在建筑中留下疤痕 _sb_在内置的 _建筑中的sb_cons.o _内置的sb_列表。o ... _nextargtail,引用自: _B_从内置开始 _内置的第二个 _下一页,参考自: _在类型中构建类祖先 _插槽\u在类型中合并。o _类_按类型计算。o _在types.o中生成分支 _在类型中构建优先级。o _在types.o中更新\u generic\u nexts _在types.o中查找\u next\u方法 ... _xcalloc,引用自: _在read.o中创建_read_状态 _类型中的alloc_s_obj _类型中的alloc_ungc_obj _在types.o中创建 _在类型中创建\u t。o _在types.o中创建_nil _在types.o中创建dict ... _xmalloc,引用自: _标记\u应用于read.o _创建\u字符串\u计数在类型中。o _stream_printf在type.o中 _类型中的弱\u引用 _备忘录中的gc\u alloc\u protoroot 里欧 _varctx_在内存中创建。o _内存中的stutter_init.o ... _xrealloc,引用自: _标记\u应用于read.o _类型中的gettypeid _插槽\u在类型中合并。o _内存中的gc_prot_空闲。o _内存中的gc_记录。o _mark_在内存中有空闲。o _在内存中进行gc_扫描 ... ld:未找到架构x86_64的符号 clang:错误:链接器命令失败,退出代码为1使用-v查看调用 生成[1]:***[libstutter-0.16.so]错误1 make:**[安装]错误2 内存分配库似乎有一个问题,没有正确加载,但是是的,至少可以说,我对C语言的理解不是很好。欢迎任何帮助。请注意,文档本身说该安装仅针对Linux进行了测试,因此可能需要进行一些修改才能在MacOSX上运行 谢谢 编辑1:回应rici的回答。首先,谢谢你的快速回答。我尝试了您的解决方案,如下所示:如何在MacOSX 10.12上编译STUTTER lang,c,installation,malloc,C,Installation,Malloc,我现在正在翻阅加里·W·弗莱克(Gary W Flake)的超级好书《自然的计算之美》,他在书中介绍了。我正在尝试在MacOSX 10.12.6上安装它 TL;DR:最终解决方案是: 编辑stutter/Makefile和shell/Makefile,并用-g wheel或-g sys替换-g root的所有实例 运行以下命令sudo是必需的: sudo IA64=1 CFLAGS='-std=gnu89'前缀=/usr/local make install 请参阅下面的原始问题,并阅读rici
Guillaume@Guillaumes-MacBook-Pro:~/Downloads/stutter-0.16$ IA64=1 CFLAGS=gnu89 make install
cd stutter && make install
cc gnu89 -g -Wall -DVERSION=\"0.16\" -DREFPATH=\"/usr/share/stutter\" -I/usr/local/opt/readline/include -c -o read.o read.c
clang: error: no such file or directory: 'gnu89'
make[1]: *** [read.o] Error 1
make: *** [install] Error 2
我猜CFLAGS的格式不正确,所以我尝试了以下方法,这又带来了另一个错误,这让我觉得我们缺少了其他东西:
Guillaume@Guillaumes-MacBook-Pro:~/Downloads/stutter-0.16$ IA64=1 CFLAGS='-std=gnu89' make install
cd stutter && make install
cc -std=gnu89 -g -Wall -DVERSION=\"0.16\" -DREFPATH=\"/usr/share/stutter\" -I/usr/local/opt/readline/include -c -o read.o read.c
cc -std=gnu89 -g -Wall -DVERSION=\"0.16\" -DREFPATH=\"/usr/share/stutter\" -I/usr/local/opt/readline/include -c -o types.o types.c
cc -std=gnu89 -g -Wall -DVERSION=\"0.16\" -DREFPATH=\"/usr/share/stutter\" -I/usr/local/opt/readline/include -c -o memory.o memory.c
memory.c:160:18: warning: cast to 'varctx *' (aka 'struct varctx *') from
smaller integer type 'int' [-Wint-to-pointer-cast]
gc_protect_root((varctx *) ((ptrint)obj | 1));
^
memory.c:166:20: warning: cast to 'varctx *' (aka 'struct varctx *') from
smaller integer type 'int' [-Wint-to-pointer-cast]
gc_unprotect_root((varctx *) ((ptrint)obj | 1));
^
memory.c:474:16: warning: cast to 's_obj *' (aka 'struct s_obj *') from smaller
integer type 'int' [-Wint-to-pointer-cast]
gc_mark_obj((s_obj *) ((ptrint) (p->root) ^ 1));
^
3 warnings generated.
cc -std=gnu89 -g -Wall -DVERSION=\"0.16\" -DREFPATH=\"/usr/share/stutter\" -I/usr/local/opt/readline/include -c -o eval.o eval.c
cc -std=gnu89 -g -Wall -DVERSION=\"0.16\" -DREFPATH=\"/usr/share/stutter\" -I/usr/local/opt/readline/include -c -o builtins.o builtins.c
cc -std=gnu89 -g -Wall -DVERSION=\"0.16\" -DREFPATH=\"/usr/share/stutter\" -I/usr/local/opt/readline/include -c -o mathbuiltins.o mathbuiltins.c
cc -std=gnu89 -g -Wall -DVERSION=\"0.16\" -DREFPATH=\"/usr/share/stutter\" -I/usr/local/opt/readline/include -c -o sforms.o sforms.c
cc -shared -o libstutter-0.16.so read.o types.o memory.o eval.o builtins.o mathbuiltins.o sforms.o -L/usr/local/opt/readline/lib -lm
rm -f libstutter.so
ln -s libstutter-0.16.so libstutter.so
rm -f libstutter.a
ar scq libstutter.a read.o types.o memory.o eval.o builtins.o mathbuiltins.o sforms.o
ranlib libstutter.a
install -o root -g root -m755 -d /usr/lib
install: root: Invalid argument
make[1]: *** [install] Error 67
make: *** [install] Error 2
你知道这个新错误是怎么回事吗?不知何故,root似乎是无效的参数
编辑2:我由此发现根组在OSX上不存在,所以我手动编辑了shell/Makefile和stutter/Makefile,以按照线程中的建议将-g root的所有实例替换为-g wheel。我越来越近了,但现在面临一个新的错误:
Guillaume@Guillaumes-MacBook Pro:~/Downloads/stutter-0.16$IA64=1 CFLAGS='-std=gnu89'前缀=/usr/local make-install
cd stutter&make安装
cc-std=gnu89-g-Wall-DVERSION=\0.16 \-DREFPATH=\/usr/local/share/stutter \-I/usr/local/opt/readline/include-c-o read.o read.c
cc-std=gnu89-g-Wall-DVERSION=\0.16 \-DREFPATH=\/usr/local/share/stutter \-I/usr/local/opt/readline/include-c-o-types.o-types.c
cc-std=gnu89-g-Wall-DVERSION=\0.16 \-DREFPATH=\/usr/local/share/stutter \-I/usr/local/opt/readline/include-c-o memory.o memory.c
memory.c:160:18:警告:从
较小的整数类型“int”[-Wint到指针强制转换]
gc_protect_rootvarctx*ptrintobj|1;
^
memory.c:166:20:警告:从
较小的整数类型“int”[-Wint到指针强制转换]
gc_unprotect_rootvarctx*ptrintobj|1;
^
memory.c:474:16:警告:从较小的值转换为's_obj*'或'struct s_obj*'
整数类型“int”[-Wint到指针强制转换]
gc_mark_objs_obj*ptrint p->root^1;
^
生成3个警告。
cc-std=gnu89-g-Wall-DVERSION=\0.16 \-DREFPATH=\/usr/local/share/stutter \-I/usr/local/opt/readline/include-c-o eval.o eval.c
cc-std=gnu89-g-Wall-DVERSION=\0.16 \-DREFPATH=\/usr/local/share/stutter \-I/usr/local/opt/readline/include-c-o builtins.o builtins.c
cc-std=gnu89-g-Wall-DVERSION=\0.16 \-DREFPATH=\/usr/local/share/stutter \-I/usr/local/opt/readline/include-c-o mathbuilins.o mathbuilins.c
cc-std=gnu89-g-Wall-DVERSION=\0.16 \-DREFPATH=\/usr/local/share/stutter \-I/usr/local/opt/readline/include-c-o sforms.o sforms.c
cc-shared-o libstutter-0.16.so read.o types.o memory.o eval.o builtins.o mathbuilins.o sforms.o-L/usr/local/opt/readline/lib-lm
rm-f libstutter.so
ln-s libstutter-0.16.so libstutter.so
rm-f libstutter.a
arscqlibstutter.a read.o types.o memory.o eval.o builtins.o mathbuilins.o sforms.o
兰利布·利布斯图特
安装-o root-g sys-m755-d/usr/local/lib
安装:chown 0:3/usr/local/lib:不允许操作
安装-o根-g系统-m755-d/usr/local/include/stutter
安装:chown 0:3/usr/local/include/stutter:不允许操作
安装-o root-g sys-m755-d/usr/local/share/stutter
安装:chown 0:3/usr/local/share/stutter:不允许操作
安装-o root-g sys-m755 libstutter-0.16.so libstutter.so libstutter.a/usr/local/lib
安装:/usr/local/lib/libstutter-0.16.so:chown/chgrp:不允许操作
生成[1]:***[install]错误71
make:**[安装]错误2
这似乎与High Sierra不允许在/usr/local中继续工作的州有关。但我不知道如何摆脱这种局面
编辑4:只需添加sudo就可以了,在顶部添加了最终解决方案
Guillaume@Guillaumes-MacBook Pro:~/Downloads/stutter-0.16$sudo IA64=1 CFLAGS='-std=gnu89'前缀=/usr/local make install
cd stutter&make安装
cc-std=gnu89-g-Wall-DVERSION=\0.16 \-DREFPATH=\/usr/local/share/stutter \-c-o read.o read.c
cc-std=gnu89-g-Wall-DVERSION=\0.16 \-DREFPATH=\/usr/local/share/stutter \-c-o-types.o-types.c
cc-std=gnu89-g-Wall-DVERSION=\0.16 \-DREFPATH=\/usr/local/share/stutter \-c-o memory.o memory.c
memory.c:160:18:警告:从
较小的整数类型“int”[-Wint到指针CA
t]
gc_protect_rootvarctx*ptrintobj|1;
^
memory.c:166:20:警告:从
较小的整数类型“int”[-Wint到指针强制转换]
gc_unprotect_rootvarctx*ptrintobj|1;
^
memory.c:474:16:警告:从较小的值转换为's_obj*'或'struct s_obj*'
整数类型“int”[-Wint到指针强制转换]
gc_mark_objs_obj*ptrint p->root^1;
^
生成3个警告。
cc-std=gnu89-g-Wall-DVERSION=\0.16 \-DREFPATH=\/usr/local/share/stutter \-c-o eval.o eval.c
cc-std=gnu89-g-Wall-DVERSION=\0.16 \-DREFPATH=\/usr/local/share/stutter \-c-o builtins.o builtins.c
cc-std=gnu89-g-Wall-DVERSION=\0.16 \-DREFPATH=\/usr/local/share/stutter \-c-o mathbuiltins.o mathbuiltins.c
cc-std=gnu89-g-Wall-DVERSION=\0.16 \-DREFPATH=\/usr/local/share/stutter \-c-o sforms.o sforms.c
cc-shared-o libstutter-0.16.so read.o types.o memory.o eval.o builtins.o mathbuilins.o sforms.o-lm
rm-f libstutter.so
ln-s libstutter-0.16.so libstutter.so
rm-f libstutter.a
arscqlibstutter.a read.o types.o memory.o eval.o builtins.o mathbuilins.o sforms.o
兰利布·利布斯图特
安装-o root-g sys-m755-d/usr/local/lib
安装-o根-g系统-m755-d/usr/local/include/stutter
安装-o root-g sys-m755-d/usr/local/share/stutter
安装-o root-g sys-m755 libstutter-0.16.so libstutter.so libstutter.a/usr/local/lib
安装-o root-g sys-m644 lib/*/usr/local/share/stutter
安装-o root-g sys-m644 types.h memory.h eval.h builtins.h stutter.h read.h/usr/local/include/stutter
光盘外壳和制作安装
cc-c-o main.o main.c-std=gnu89-I../stutter
main.c:26:9:警告:使用类型隐式声明库函数“strlen”
'unsigned long const char*'[-Wimplicit函数声明]
len=strlentext;
^
main.c:26:9:注意:包括标题或显式提供
斯特伦宣言
main.c:39:6:警告:使用
键入“int const char*,const char*,无符号长”
[-Wimplicit函数声明]
ifstrncasecmpname,text,len==0
^
main.c:39:6:注意:包括标题或显式提供
“strncasecmp”的声明
main.c:40:11:警告:使用类型隐式声明库函数“strdup”
'char*const char*'[-Wimplicit函数声明]
返回strdupname;
^
main.c:40:11:注意:包括标题或显式提供
声明为'strdup'
main.c:96:21:警告:使用类型隐式声明库函数“isspace”
'int'[-Wimplicit函数声明]
如果*c&&beg&&!isspace*c
^
main.c:96:21:注意:包括标题或显式提供
“iSpace”的声明
生成4个警告。
cc-o stt干管o-LSTUTER-L../stutter-lm-L引线
安装-o root-g sys-m755-d/usr/local/bin
安装-o根-g系统-m755 stt/usr/local/bin
Guillaume@Guillaumes-MacBookPro:~/Downloads/stutter-0.16$ls
安装Makefile自述文件/shell/stutter/tests/
Guillaume@Guillaumes-MacBookPro:~/Downloads/stutter-0.16$stt
欢迎来到Stutter0.16
>
是啊!非常感谢rici 这里的问题是,源代码是为一个旧版本的GCC编写的,它使用自己独特的非标准语义进行内联声明。内联声明后来被合并到C标准中,但语义略有不同 GCC允许您使用-std命令行选项指定用于编译源代码的几种可能标准之一,包括用于包含GNU扩展的选项。多年来,默认的标准设置是gnu89,即原始的ANSI C标准,有许多GNU扩展,包括GNU内联的建议。GCC的最新版本改为使用默认的gnu99,这使得使用C99的GNU扩展更少;在这个版本中,内联带有C标准语义 由于您安装的GCC使用C99+gnu作为默认值,因此STUTTER源代码无法正确编译。这不仅限于OSX;它在Linux上表现出同样的问题。因此,您需要告诉GCC使用-std=gnu89,以便重现为其编写源代码的标准。您也可以修复源代码,但这将是更多的工作 要重新编译项目,您首先需要清除已经执行的错误编译。您可以从下载的tarball重新创建构建文件,但以下操作似乎可以正常工作:
make clean
IA64=1 CFLAGS=-std=gnu89 make install
根据INSTALL,IA64=1表示您正在构建一个64位系统,我想您是这样的。最终解决方案是:
编辑stutter/Makefile和shell/Makefile并替换
默认情况下,OSX中不存在作为根组的-g root by-g wheel或-g sys的所有实例
运行以下命令sudo是必需的。CFLAGS必须指向gcc的-std参数的旧标准,详情请参见
sudo IA64=1 CFLAGS='-std=gnu89'前缀=/usr/local make install
你好,Rici,请阅读我的编辑,根据你的回答,我能够在我的机器上编译Stutter!非常感谢你。请参阅原始问题中的最终解决方案。@naif:很抱歉输入错误。修好了,但看起来你已经解决了。