在Fedora 31安装MPIR-3.0后编译报错:‘mpir_ui’未在此作用域声明
解决MPIR编译时
mpir_ui未声明的错误 你这是把GMP和MPIR的类型命名搞混啦——MPIR库里根本没有mpir_ui这个类型!下面是具体的解决步骤:
1. 修正错误的类型定义
MPIR完全兼容GMP的类型体系,无符号整数对应的标准类型是mp_ui(它是unsigned long的别名)。把代码里的:
mpir_ui two = 2; //mpir unsigned integer variable
改成:
mp_ui two = 2; // MPIR/GMP 标准无符号整数类型
要是你不想用库定义的别名,直接写unsigned long two = 2;也完全没问题,因为mp_ui本质就是unsigned long的typedef。
2. 清理冗余头文件(可选但推荐)
你的代码同时包含了<gmp.h>和<mpir.h>,其实mpir.h已经包含了所有GMP兼容的接口定义,重复包含<gmp.h>完全没必要,可以删掉这一行让代码更简洁。
3. 确认编译命令的链接顺序(优化建议)
虽然这不是当前错误的直接原因,但链接库的顺序会影响依赖解析。MPFR依赖GMP/MPIR,所以编译命令最好把依赖库放在前面,正确的编译命令应该是:
g++ your_source_file.cpp -o mpir_test -lmpfr -lmpir -lgmp
如果你的系统中MPIR已经完全替代了GMP,甚至可以去掉-lgmp,不过保留也不会有问题。
修改后的完整代码
#include <stdio.h> #include <mpir.h> #include <mpfr.h> #include <iostream> using namespace std; int main(int argc, char* argv[]) { mpf_t a; // MPIR 浮点类型变量 mpf_init(a); // 初始化变量a mp_ui two = 2; // MPIR 无符号整数变量 FILE* stream = stdout; // 明确指定输出到控制台(原代码未赋值会导致未定义行为) mpf_init_set_ui(a, 2); // 将a的值设为2 mpf_out_str(stream, 10, 2, a); // 输出a的值 cout << "\nMPIR working" << "\n" ; // 别忘了清理资源(良好编程习惯) mpf_clear(a); return 0; }
另外注意:原代码里FILE* stream;没有赋值就传给mpf_out_str会导致未定义行为,我已经帮你改成FILE* stream = stdout;,这样才能正确输出到控制台。
内容的提问来源于stack exchange,提问作者Itachi Uchiwa
相关产品推荐
相关产品推荐

