d的导入c,你的下个c编译器是d编译器
原文
ImportC是C11编译器.关注的是标准兼容性,而不是实现大量不同的扩展.
火卫一(D标准库)包含一份zlib语言,ImportC消除了在DMD构建过程中需要外部C编译器,即所有DMD都可以由DMD构建.实际上,这是ImportC开发背后的动机之一.
用DMD构建oksh
oksh不含D代码.用OpenBSD下类似clang的CC来配置oksh.
DMD使用与C编译器不同的标志.首先要注意,DMD没有-o标志,如果要设置输出文件名,要使用-of(注意,没有空格).D本身不使用预处理器,因此在使用ImportC时,与C预处理器标志不同.该标志是-P=.如,oksh使用-DEMACS和-DVI接口标志,对DMD,这些标志需要转换为-P=-DEMACS和-P=-DVI.
//Makefile
.c.o:
${CC} ${CFLAGS} -of$@ -c $<
结合CFLAGS产生:
dmd -g -O -P=-DEMACS -P=-DVI -ofalloc.o -c alloc.c
//-P,P为预处理
OpenBSD使用gnu扩展汇编.
DMD虽然理解内联汇编,但它不理解GNU扩展汇编.
用#ifdef简单去掉.运行make,
dmd -g -O -P=-DEMACS -P=-DVI -ofc_ksh.o -c c_ksh.c
c_ksh.c(1210): 错误.
//还不支持
用clang编译.expr.c也不能编译,其他都编译过了.
修改-lcurses链接为-L=-lcurses.
会遇到很多链接错误.再加上-P=-D_ANSI_LIBRARY预处理指令,就可以编译通过了.
加上-betterC标志,再加上-inline/-release,加上-L=--as-needed标志,告诉lld不链接未用库.
浙公网安备 33010602011771号