Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在MacOSX 10.12上编译STUTTER lang_C_Installation_Malloc - Fatal编程技术网

如何在MacOSX 10.12上编译STUTTER lang

如何在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

我现在正在翻阅加里·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的回答。首先,谢谢你的快速回答。我尝试了您的解决方案,如下所示:

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:很抱歉输入错误。修好了,但看起来你已经解决了。