`
h_rain
  • 浏览: 121570 次
  • 性别: Icon_minigender_1
  • 来自: 哈尔滨
文章分类
社区版块
存档分类
最新评论

在cygwin中编译gdc 0.23

阅读更多
一 准备
前面的setup过程参考gdc的安装说明.
/cygdrive/d/gdc/gcc-3.4.5是gdc的源码目录
在cygwin的环境下,要不就修改gdc automake文件的版本,要不就安装1.9.4,需要保持版本一致
拷贝cygwin下的cygiconv-2.dll,cygintl-2.dll,cygintl-8.dll到gcc-3.4.5/gcc目录

二 配置
cd /cygdrive/d/gdc/gcc-3.4.5
configure --prefix=/usr/local/gdc --enable-languages=c,d

三 构建
1 
	make
	到配置phobos出错,不用管,进行下面的安装
2 
	make install
3
	cp /usr/local/gdc/bin/gdc /usr/local/gdc/bin/gdc-3.4.5.exe
4	
	cd /cygdrive/d/gdc/gcc-3.4.5/i686-pc-cygwin/libphobos
	PATH='/usr/local/gdc/bin':$PATH CC=/usr/local/gdc/bin/gdc-3.4.5.exe /bin/sh /cygdrive/d/gdc/gcc-3.4.5/libphobos/configure  --host=i686-pc-cygwin --build=i686-pc-cygwin --enable-multilib --prefix=/usr/local/gdc --enable-languages=c,d --with-gcc-version-trigger=/cygdrive/d/gdc/gcc-3.4.5/gcc/version.c --program-transform-name=s,y,y, --srcdir=../.././libphobos --with-target-subdir=i686-pc-cygwin CPPFLAGS='-O2' build_alias=i686-pc-cygwin host_alias=i686-pc-cygwin  --no-create --no-recursion target_alias=i686-pc-cygwin
5
	make
	make install


自己写的备忘,不是很清晰.
大家拍砖的时候,请帮忙完善:)
分享到:
评论
18 楼 h_rain 2007-04-21  
因为代码里面,所有判断是否为COM接口,是否有虚表偏移,其实就是对com变量的正反判断。
只有com接口的虚表是干净的,没有classInfo在0上,那这样,后端也需要知道,生成代码的时候,虚表的0位置是什么。
这就是上面的代码指示的。

其他的,好像没什么了,虚表的处理里面好像就是这样的了。

明天如果能动态调试的话,跟踪一边会更清晰。

qiezi最好是先试试,看将ISuppors改名为IUnknown是否能正确调用xpcom组件。
17 楼 oldrev 2007-04-21  
别这么费劲了,要么就做一个乖宝宝,就用 struct 算了,要么发邮件强烈要求 Walter 加一个 pragma(nortti) 之类的东西
16 楼 h_rain 2007-04-21  
qiezi先这么试试,看xpcom组件能否调用成功呀!

那剩下的地方,就应该是这里了

D:/gdc/gcc-3.4.5/gcc/d/dmd/toobj.c
00880     // flags
00881     dti32(&dt, 4 | com, true);


生成给后端使用的虚拟语义树的时候使用了。

15 楼 qiezi 2007-04-21  
我好像越发地看不明白了。。先看看,晚点再评论。
14 楼 h_rain 2007-04-21  
但代码里面,就是这么说的呀...
13 楼 h_rain 2007-04-21  
只是感觉,用判断接口名字的方式来判断是否为COM接口,这个方法有点...

就像我前两天说的,调用约定与接口类型的说明是应该分开的,现在看是分开了,但不修改编译器,几乎就没有扩展性了...

要不,qiezi在修改IDL生成器的时候,把所有的ISuppors接口都在D中改名为IUnknown?

这样是不是也有问题啊,D写组件是否能被外面调用?
我估计如果是通过IID而不是名字,应该对外面没有影响。
12 楼 qiezi 2007-04-21  
晕倒。你这个修改是欺骗编译器还是欺骗自己呢。。IUnknown是作了特殊处理,这里可能会兼容,但并不能让它与XPCOM兼容。
11 楼 h_rain 2007-04-21  
之前考虑的方向,就是没有认为COM接口必须继承自IUnknown!
只有COM接口里的虚表是干净的,否则类与非COM接口中的虚表数组元素0都是ClassInfo。

但如果上面的测试通过了,那是否说明Windows 的COM接口中,并没有那个占位符啊?
10 楼 h_rain 2007-04-21  
根据上面的分析,初步将测试用例改成这个样子,就能通过了。
extern(Windows):
int test1(IUnknown p)
{
    return 1;
}

int test2(IUnknown p)
{
    return 2;
}

int test3(IUnknown p)
{
    return 3;
}

struct InterfaceVtbl
{
extern(Windows):
    int function(IUnknown) test1;
    int function(IUnknown) test2;
    int function(IUnknown) test3;
}

struct Interface
{
    InterfaceVtbl* vtbl;

    InterfaceVtbl vtbl_;

    static Interface opCall()
    {
        Interface res;
        res.vtbl_.test1 = &test1;
        res.vtbl_.test2 = &test2;
        res.vtbl_.test3 = &test3;
        res.vtbl = &res.vtbl_;
        return res;
    }
}

interface IUnknown
{
    int test1();
    int test2();
    int test3();
}

extern (D):

void main()
{
    Interface i = Interface();
    assert(i.vtbl.test1(cast(IUnknown)&i) == 1);
    assert(i.vtbl.test2(cast(IUnknown)&i) == 2);
    assert(i.vtbl.test3(cast(IUnknown)&i) == 3);

    IUnknown ii = cast(IUnknown)&i;
    assert(ii.test1() == 1);
    assert(ii.test2() == 2);
    assert(ii.test3() == 3);
}



qiezi再试试,看如果这样就能解决,那就真的简单了:)
9 楼 oldrev 2007-04-21  
都是高人哪,改好了就用diff作个补丁发给Walter吧
8 楼 h_rain 2007-04-21  
初步看了一下,代码中的关键变量com贯穿了语义分析与代码生成部
分,明天争取跟踪调试一下代码。
InterfaceDeclaration::InterfaceDeclaration(Loc loc, Identifier *id, BaseClasses *baseclasses)
     : ClassDeclaration(loc, id, baseclasses)
 {
     com = 0;
     if (id == Id::IUnknown)             // IUnknown is the root of all COM objects
         com = 1;
 }

这里判断是否为com接口。
7 楼 qiezi 2007-04-20  
前面没问题,GDC我在LINUX上编译过几次了,到cygwin上就不行,我还是到linux上吧,操作也方便些。
6 楼 h_rain 2007-04-20  
前面的setup过程都正确吗?
我没遇到啊,打过补丁后,configure,make都没问题.

就是在make的过程中,configure phobos的时候有问题.

3ks你的测试用例,我还没开始改呢,正在用doxygen生成doc,还没完事呢.
5 楼 qiezi 2007-04-20  
我这里configure过了,make有问题亚:
$ make
Error on line 740: '+' is not a valid filename char

我看了一下Makefile文件,740行没有“+”,可能是其它文件。以前在linux上倒没碰到过什么问题。
4 楼 qiezi 2007-04-20  
如果你打算修改它,这里提供一个测试:


extern(Windows):
int test1(IInterface p)
{
	return 1;
}

int test2(IInterface p)
{
	return 2;
}

int test3(IInterface p)
{
	return 3;
}

struct InterfaceVtbl
{
extern(Windows):
	int function(IInterface) test1;
	int function(IInterface) test2;
	int function(IInterface) test3;
}

struct Interface
{
	InterfaceVtbl* vtbl;

	InterfaceVtbl vtbl_;

	static Interface opCall()
	{
		Interface res;
		res.vtbl_.test1 = &test1;
		res.vtbl_.test2 = &test2;
		res.vtbl_.test3 = &test3;
		res.vtbl = &res.vtbl_;
		return res;
	}
}

interface IInterface
{
	int test1();
	int test2();
	int test3();
}

extern (D):

void main()
{
	Interface i = Interface();
	assert(i.vtbl.test1(cast(IInterface)&i) == 1);
	assert(i.vtbl.test2(cast(IInterface)&i) == 2);
	assert(i.vtbl.test3(cast(IInterface)&i) == 3);

	IInterface ii = cast(IInterface)&i;
	assert(ii.test1() == 1);
	assert(ii.test2() == 2);
	assert(ii.test3() == 3);
}

如果虚表兼容了,这个测试就能通过。注意让gdc里面原有的测试也通过。
3 楼 qiezi 2007-04-20  
cygwin里面有个gdc,不过版本太老了:
gcc version 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)
2 楼 ideage 2007-04-19  
在windows下用,这办法不错。有空试试。
1 楼 qiezi 2007-04-19  
啊哈,我也正准备这样呢。工作并不是一直很忙,有点空的时候想看看,又不想重启到linux。

相关推荐

    cygwin可以编译生成windows下供调用的dll

    在编译链接时,可以直接链接.lib文件: ```bash gcc main.c MyTest.lib -o output.exe ``` - **确保DLL与EXE同目录** 当程序运行时,需要确保DLL文件与可执行文件位于同一目录下,或者在系统搜索路径中。 ```...

    cygwin 交叉编译的 coturn 服务器可以在windows 下运行

    本文将详细讲解如何在Cygwin环境下交叉编译coturn服务器,并使其在Windows系统下运行。 1. **Cygwin环境搭建** 在开始交叉编译前,你需要安装Cygwin。访问Cygwin官方网站,下载安装程序,运行后选择镜像源并安装所...

    Cygwin 编译 VLC 指南.doc

    - 在编译过程中,可能会遇到缺少依赖的问题,根据提示安装相应的库。 - 确保你的Cygwin安装是最新的,以避免已知问题和安全漏洞。 - 编译VLC可能需要大量的硬盘空间,因此请确保有足够的可用空间。 - 在编译前,阅读...

    cygwin下的arm交叉编译工具链

    cygwin下的arm交叉编译工具链,cygwin下的arm交叉编译工具链

    redis for Windows 7.0.7 使用cygwin编译

    在Windows 7.0.7系统中使用Cygwin编译Redis 7.0.7版本,首先需要安装Cygwin,并确保在安装时选择了编译Redis所需的依赖包,如gcc、make、autoconf、automake等。 编译Redis的步骤大致如下: 1. 下载Redis源代码:...

    使用cygwin自己编译的gdb的源码

    - 配置GDB:在Cygwin终端中导航到源码目录,运行`./configure --host=cygwin`来配置GDB以适应Cygwin环境。 - 编译源码:执行`make`命令,编译过程将生成可执行文件。 - 测试与安装:运行`make check`进行测试,...

    linphone-android 在cygwin下的编译

    ### Linphone Android在Cygwin下的编译指南 #### 一、引言 本文将详细介绍如何在Windows 7操作系统下使用Cygwin环境编译Linphone Android版本的过程。该过程适用于初学者,对于有一定经验的开发者也有一定的参考...

    使用Cygwin编译ffmpeg.doc

    在Windows环境下编译FFmpeg,通常会选择使用Cygwin,因为Cygwin提供了一个类Linux的环境,使得可以在...通过以上步骤,你可以在Cygwin环境中成功编译FFmpeg,并且可以根据需要自定义配置,实现特定功能的FFmpeg版本。

    cygwin Android NDK 交叉编译工具

    3. **Cygwin在Android NDK中的作用**:通过Cygwin,开发者可以在Windows环境下配置和使用NDK,实现对Android的交叉编译,包括设置编译器、链接器和其他构建工具。 **三、Android NDK的配置与使用** 1. **下载和...

    在cygwin下编译srilm的说明文档

    ### 在Cygwin环境下编译与安装SRILM的相关知识点 #### 一、SRILM简介及重要性 SRILM(Statistical Research Institute Language Model)工具包是一种用于构建和应用各种统计语言模型的重要工具。它由SRI ...

    cygwin中安装hadoop+eclipse编译源码并调试

    本文将详细介绍如何在Cygwin中安装Hadoop,并利用Eclipse来编译Hadoop源码以及进行调试。 首先,我们需要安装Cygwin。Cygwin提供了一个模拟Linux环境的平台,包括GCC编译器、Git等工具,这些对于编译和管理开源项目...

    Windows下的Linux编译环境cygwin

    描述:“一个很好用的工具,在windows环境下调试Linux下的程序,Windows下的Linux编译环境cygwin,在程序移植上很有帮助” 标签:“Windows下的Linux编译环境 cygwin” Cygwin是一个强大的开源工具集,它为Windows...

    windows下eclipse集成cygwin编译android_NDK

    下面将详细介绍如何在 Windows 下通过 Eclipse 集成 Cygwin 来编译 Android NDK。 #### 准备工作 在开始之前,请确保已完成了以下步骤: 1. **安装 Cygwin**:Cygwin 是一款在 Windows 上模拟 Unix 运行环境的...

    配套“编译v8引擎”文章使用 cygwin

    通过以上步骤,你不仅学会了如何在Cygwin下编译V8,也了解了Cygwin作为Windows上的类UNIX环境在开发中的作用。这个过程对理解V8引擎的内部工作原理,以及深入学习JavaScript引擎的实现细节非常有帮助。在Node.js环境...

    可以在cygwin下面编译通过的cldc kvm 1.1

    在描述中提到的“cygwin”,是一个在Windows操作系统上模拟Linux环境的工具,它允许用户在Windows上运行许多原本只支持Unix或Linux的命令行工具和程序,包括编译器和构建工具。因此,这个资源包表明了可以在Cygwin...

    android eclipse+NDK+Cygwin编译JNI 教程

    最近在研究JNI,网上说的编译JNI的方法多种多样,挑也挑花了眼,不过我不太喜欢繁琐的东西,感觉能一次搞定的最好。后来结合网上说的让后加上自己摸索,终于可以用eclipse + NDK + Cygwin编译出so文件并且能够直接...

    cygwin mingw编译的fltk2 library

    总结来说,这个压缩包提供了一个使用Cygwin和MinGW编译的FLTK2库,适用于在Code::Blocks 8.02中开发Windows GUI应用。尽管未经测试,但开发者可以按照常规的编译流程进行验证和使用,需要注意的是这个版本可能缺少...

    xgboost 已编译 (64位windows下 用mingw64 在 cygwin环境下编译)

    4. **配置编译环境**:在Cygwin终端中导航到XGBoost源码目录,执行`./configure --with-mingw64`,这将生成Makefile用于64位Windows的编译。 5. **编译XGBoost**:运行`make -j4`(-j4表示使用4个线程并行编译,你...

    亲试过可以通过cygwin编译发布cocos2d-x几种中文乱码解决方案

    cygwin可以编译过。但是我感觉直接在代码里面写宽字符=L("中文") 似乎不行。自己编译那个iconv好像也难,用jni回调后java转码似乎又违背了跨平台的真正含义。还有好多未知的系统接口调用,如果都这样干,那不如直接...

Global site tag (gtag.js) - Google Analytics