有没有一种简单的方法可以在Windows下使用Visual Studio 2005 构建GMP(GNU多精度算术库,http://gmplib.org)?我试图找到有关自己构建库的信息,但找不到任何真正帮助我的东西.我自己建立图书馆的经验不是很丰富(我已经设法建立了提升,但就是这样).
还是有一个我不知道的稳定(预建)GMP发行版?
MPIR是一个有效的替代方案(http://www.mpir.org)吗?关于GMP网站上的MPIR的评论:对于一些Windows用户来说,这个"愤怒的GMP分叉"可能是真正的GMP的替代品,但他们必须处理大量的反GMP情绪.
编辑: MPFR C++包装页面包含指向Visual Studio的GMP/MPFR解决方案的信息/链接以及编译的gmp/mpfr库:http: //www.holoborodko.com/pavel/mpfr/
我正在尝试在Cygwin上编译这个简单的GMP程序:
#include <gmp.h>
int main(){
mpz_t i;
mpz_init(i);
}
Run Code Online (Sandbox Code Playgroud)
这是命令:
gcc -lgmp test.c
我收到此错误:
/tmp/ccJpGa7K.o:test.c:(.text+0x17): undefined reference to `__imp___gmpz_init'
/tmp/ccJpGa7K.o:test.c:(.text+0x17): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `__imp___gmpz_init'
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
知道什么是错的吗?我知道它可以找到库(libgmp.dll.a),但似乎没有找到该函数.
产量nm /usr/lib/libgmp.dll.a | grep mpz_init:
0000000000000000 T __gmpz_inits
0000000000000000 I __imp___gmpz_inits
0000000000000000 T __gmpz_init_set_ui
0000000000000000 I __imp___gmpz_init_set_ui
0000000000000000 T __gmpz_init_set_str
0000000000000000 I __imp___gmpz_init_set_str
0000000000000000 T __gmpz_init_set_si
0000000000000000 I __imp___gmpz_init_set_si
0000000000000000 T __gmpz_init_set_d
0000000000000000 I __imp___gmpz_init_set_d
0000000000000000 T __gmpz_init_set
0000000000000000 I __imp___gmpz_init_set …Run Code Online (Sandbox Code Playgroud) 使用OS X 10.11.1(El Capitan)和PHP 5.5.29.
我想在我的PHP中添加GMP扩展,但我不知道这样做.根据PHP手册,我认为编译PHP有一个--with-gmp=dir选项.但我不知道如何编译PHP(我怀疑我是否在这台机器上做过,iirc默认情况下它只是带有PHP),而且我也不知道用于该--with-gmp=选项的dir是什么.
我确实有自制软件,我注意到一个相当旧的类似问题,但似乎不起作用(软件包不再可用).
我注意到在酿造中有一些东西叫做homebrew/php/php55-gmp但是暗示了什么brew tap.我不知道那是什么,我宁愿不要弄乱我的Homebrew配置或我的整个开发环境(我想这不太可能,但我不知道当我弄乱这个水龙头时我正在对我的系统做什么).
我一直在尝试安装Haskell平台,并cabal-install在没有安装GNU Multi-Precision软件包(GMP)的系统上在用户空间的Linux上安装.
我设法安装了GHC-6.12.1并且GHCi通过设置LB_LIBRARY_PATH指向我安装GMP的lib目录cabal-install来工作,但是在下一步遇到问题,开始工作.它一直试图(静态地)链接到GMP.
这失败是因为GMP没有安装在系统中并且ld没有找到库的位置,并且没有环境变量(我知道)可以告诉ld在哪里可以找到用户安装的GMP,以及(显然)没有办法告诉配置Cabal提供相关-L标志.
经过多次徒劳无功的搜索和黑客攻击后,我找到了一个荒谬的简单想法,即安装我自己的ldshell脚本,调用ld具有相应-L标志的系统.
这是shell脚本101,当然:
#!/bin/sh
/usr/bin/ld -L$HOME/gnu/lib "$@"
Run Code Online (Sandbox Code Playgroud)
有了这个脚本安装在我PATH之前的目录中/usr/bin所有的问题似乎已经消失了.
我正在使用GNU Multi-Precision(GMP)库代码使用任意长度的整数来阅读一些代码.MP整数的类型mpz_t与gmp.h头文件中的定义相同.
但是,我对这个库定义mpz_t类型的低级定义有一些疑问.在标题代码中:
/* THIS IS FROM THE GNU MP LIBRARY gmp.h HEADER FILE */
typedef struct
{
/* SOME OTHER STUFF HERE */
} __mpz_struct;
typedef __mpz_struct mpz_t[1];
Run Code Online (Sandbox Code Playgroud)
第一个问题:是否[1]与__mpz_struct?换句话说,typedef将mpz_t类型定义为__mpz_struct具有一次出现的数组?
第二个问题:为什么阵列?(为什么只出现一次?)这是我听说过的结构黑客之一吗?
第三个问题(可能与第二个问题间接相关):mpz_init_set(mpz_t, unsigned long int)函数的GMP文档说只使用它作为pass-by-value,尽管可以假设这个函数会在被调用函数中修改它的内容(因此需要pass-by-reference)语法.参考我的代码:
/* FROM MY CODE */
mpz_t fact_val; /* declaration */
mpz_init_set_ui(fact_val, 1); /* Initialize fact_val */
Run Code Online (Sandbox Code Playgroud)
单次出现数组是否允许自动传递引用(由于C中数组/指针语义的崩溃)?我很自然地承认我有点过分分析这个,但我当然喜欢对此进行任何讨论.谢谢!
我最后花了几个小时从Ubuntu 12.10中的源代码编译cpabe包,其中包含gmp和pbc依赖项.以下错误消息似乎是Web中许多人的问题(即使编译其他需要安装libgmp作为依赖项的软件包!).然而,我找不到任何可行的解决方案:
...
/usr/bin/ld: /usr/local/lib/libpbc.so: undefined reference to symbol '__gmpz_init'
/usr/bin/ld: note: '__gmpz_init' is defined in DSO /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/libgmp.so so try adding it to the linker command line
/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/libgmp.so: could not read symbols: Invalid operation
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud) 我已经brew install编mpc和gmp,但是当我尝试pip install gmpy2,我得到就行了编译错误
#include "mpc.h"
Run Code Online (Sandbox Code Playgroud)
所以出于某种原因clang无法找到mpc图书馆.我不确定此时应该做些什么.
似乎GMP只提供了mpf(浮点)类型的字符串序列化:
mpf_get_str(), mpf_class::get_str()
mpz(整数)类型具有原始字节的附加接口: mpz_out_raw()
http://gmplib.org/manual/Function-Index.html
我错过了什么吗?有谁知道另一个可以序列化GMP浮点数的库?有谁知道另一个提供强大序列化的bignum lib?
编辑:我很高兴序列化MPFR的mpfr_t,同样似乎只提供字符串输出:http://www.mpfr.org/mpfr-current/mpfr.html#Function-Index
对我之前的问题的回答表明Haskell表示plusWord2#为llvm.uadd.with.overflow.我希望使用进位进行长时间的添加,就像x86 ADC指令的工作方式一样.该指令不仅添加了两个参数,还添加了进位的内容.
然后可以添加如下的长数字:
ADD x1 y1
ADC x2 y2
ADC x3 y3
...
Run Code Online (Sandbox Code Playgroud)
导致每个单词一个指令(忽略所需的任何周围移动等).
我查看了GMP库,以及它在通用C代码中如何进行长时间的添加.这是摘录自mpn/generic/add_n.c
sl = ul + vl;
cy1 = sl < ul;
rl = sl + cy;
cy2 = rl < sl;
cy = cy1 | cy2;
Run Code Online (Sandbox Code Playgroud)
注意,它保存了原始加法和进位位加法的进位.这些操作中只有一个可以携带,因此或者之后的携带就足够了.
显然,GMP具有针对特定平台的特定汇编代码,但我认为通用代码是一个很好的基础,因为它可能被编写为编译成合理的代码.在plusWord2#原始的操作手段,我不需要做无聊的比较,以获得进位,所以我实现了GMP的通用代码就像在Haskell如下:
addWithCarry :: Word# -> Word# -> Word# -> (# Word#, Word# #)
addWithCarry x y c =
let
(# c1, r1 #) = plusWord2# x y
(# c2, r2 …Run Code Online (Sandbox Code Playgroud)