DSP

打造windows下的嵌入式开发工具(3):gmp-4.2.3

2019-07-13 15:04发布

快乐虾 http://blog.csdn.net/lights_joy/ lights@hb165.com      本文适用于 ADI Blackfin系列DSP 优视科技BV561EVB开发板 gcc-4.3.1 binutils-2.18 codeblocks-8.02 Skyeye-1.2.5 bfin-uclinux-2008r1-rc8 Cygwin gcc 3.4.4 Visual studio 2005 Visual DSP++ 5.0    欢迎转载,但请保留作者信息     gmplib是一个用于大数运算的库,在gcc-4.3.1中使用了它。其官方网站为http://gmplib.org/,目前的版本是4.2.3。在这个版本中,并没有提供在vs2005下的port,但是在http://fp.gladman.plus.com/computing/gmp4win.htmGladman提供了gmp-4.2.3vs2008下的工程文件http://fp.gladman.plus.com/computing/gmp-4.2.3.vc9.zip。将它们都解压缩到gmp-4.2.3 在使用这个工程文件之前必须先做一个转换,这样vs2005才能识别。 按照Gladman提供的readme.txt中的说法,将.vcproj工程文件中的     Version="9.00" 替换为     Version="8.00" 然后将.sln文件中的 Microsoft Visual Studio Solution File, Format Version 10.00 # Visual Studio 2008 改为: Microsoft Visual Studio Solution File, Format Version 9.00 # Visual Studio 2005 这样就可以直接在vs2005下打开gmp.sln这个工程了。 在编译之前还有一件事要做。在Gladman提供的压缩包里有一个longlong.h的文件,这个文件中有这样一段代码: #ifdef _MSC_VER #  include     #  if defined( _WIN64 ) #    define count_leading_zeros(c,x)        /       do {                                  /         ASSERT ((x) != 0);                  /         _BitScanReverse64(&c, (x));         /         c = 63 - c;                         /       } while (0) #    define count_trailing_zeros(c,x)       /       do {                                  /         ASSERT ((x) != 0);                  /         _BitScanForward64(&c, (x));         /       } while (0) #    define umul_ppmm(xh, xl, m0, m1)       /       do {                                  /         xl = _umul128( (m0), (m1), &xh);    /       } while (0) #  else #    define count_leading_zeros(c,x)        /       do {                                  /         ASSERT ((x) != 0);                  /         _BitScanReverse(&c, (x));           /         c = 31 - c;                         /       } while (0) #    define count_trailing_zeros(c,x)       /       do {                                  /         ASSERT ((x) != 0);                  /         _BitScanForward(&c, (x));           /       } while (0) #    define umul_ppmm(xh, xl, m0, m1)       /       do { unsigned __int64 _t;             /         _t = __emulu( (m0), (m1));          /         xl = _t & 0xffffffff;               /         xh = _t >> 32;                      /       } while (0) #  endif   #endif 这一段代码在vs2005下编译的时候将引起__emulu_BitScanForward函数的链接错误。按照Gladman的建议,这一段代码可以直接删除,但是实际上直接在这段代码的前面加上 #pragma intrinsic(_BitScanReverse) #pragma intrinsic(_BitScanForward) #pragma intrinsic(__emul) #pragma intrinsic(__emulu) 也可以解决这个问题。引发这个问题的原因可以查msdn中的相关函数说明。 经过这两个修改后,直接在vs2005build,将在gmp-4.2.3/build.vc9/lib/Win32/Debug目录下生成gmp.hgmp.lib,这是一个静态库文件,可以供gcc-4.3.1使用。      

参考资料

host-i686-pc-cygwin/libiberty/Makefile解析(2008-8-19) host-i686-pc-cygwin/fixincludes/Makefile分析(2008-8-19) host-i686-pc-cygwin/zlib/Makefile分析(2008-8-19) host-i686-pc-cygwin/libcpp/Makefile分析(2008-8-19) host-i686-pc-cygwin/libdecnumber/Makefile分析(2008-8-19) bfin-xxx-gcccc1plus.exe的生成2008-08-23 bfin-xxx-gccfortran目标的生成(2008-8-24) bfin-xxx-gccjava目标的生成(2008-8-24) bfin-xxx-gccobjc目标的生成(2008-8-26) bfin-xxx-gcccollect2目标的生成(2008-8-26) 打造windows下的嵌入式开发工具(1):目标(2008-9-3) 打造windows下的嵌入式开发工具(2)binutils-2.18(2008-9-3)