Mac安装GMP大数运算库,并连接到Clion
1.下载GMP, 为了便于在Mac下解压缩,建议下载tar.xz版本的。
2. 解压缩文件某个目录下(本机解压在~/ 路径下,文件名字为gmp)
当然你也可以参考官网上的pdf文档,很全面。
#比较耗时 可以再make的时候加上 -j$ $代表cpu核心数 加速编译
#比如我的电脑为2核4线程 :make -j4
cd ~/gmp
./configure
make
make check
make install
3.查看是否成功安装
检查这两个目录下是否有gmp的相关文件
cd /usr/local/lib
cd /use/local/include
或者使用gcc检测调用
gcc test.cpp -o test -lgmp #注意加上这个lgmp
具体的代码可以参见这位老哥的博文
4.在Clion里添加库文件(最终版见6小节)
cmake_minimum_required(VERSION 3.13)
project(MyGMP)
set(CMAKE_CXX_STANDARD 14)
add_executable(MyGMP main.cpp)
# To use GMP, you need add two lines into you CMakeLists.txt
# You need find your GMP installed path firstly, and Then add them.
include_directories("/usr/local/include")
target_link_libraries(MyGMP "/usr/local/lib/libgmp.a")
前四行为自动生成的代码,后两行为添加的代码(MyGMP为项目名称,此处因项目名而异)
/** 最后来个测试代码*/
#include <iostream>
#include <gmp.h>
#include <gmpxx.h>
using namespace std;
int main(int argc, char **argv) {
mpz_t begin, m1, m2;
int count;
/* set begin to 2^127 */
mpz_init_set_str(begin, "170141183460469231731687303715884105728", 0);
count = (argc==1)?10:atoi(argv[1]);
while(count--) {
mpz_nextprime(begin, begin);
gmp_printf("%Zd/n", begin);
}
mpz_clear(begin);
return 0;
}
/** haha ok*/
5.一个很严重的问题(C++ mpz_class的“<<”输出)
如下代码:
/** 最后来个测试代码*/
#include <iostream>
#include <gmp.h>
#include <gmpxx.h>
using namespace std;
int main(int argc, char **argv) {
mpz_class z = 1000000;
cout << "value " << z << "\n";
// cout << "value " << z.get_str() << "\n";
return 0;
}
#出现了如下的报错
/Applications/CLion.app/Contents/bin/cmake/mac/bin/cmake --build /Users/zhao/CLionProjects/MyGMP/cmake-build-debug --target MyGMP -- -j 2
Scanning dependencies of target MyGMP
[ 50%] Building CXX object CMakeFiles/MyGMP.dir/main.cpp.o
[100%] Linking CXX executable MyGMP
Undefined symbols for architecture x86_64:
"operator<<(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, __mpz_struct const*)", referenced from:
std::__1::basic_ostream<char, std::__1::char_traits<char> >& operator<<<__mpz_struct [1], __mpz_struct [1]>(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, __gmp_expr<__mpz_struct [1], __mpz_struct [1]> const&) in main.cpp.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[3]: *** [MyGMP] Error 1
make[2]: *** [CMakeFiles/MyGMP.dir/all] Error 2
make[1]: *** [CMakeFiles/MyGMP.dir/rule] Error 2
make: *** [MyGMP] Error 2
上述问题没有得到解决,但是查阅stackover找到了另外的方法解决,输出转化为str ,但是输入仍有问题!
int main(int argc, char **argv) {
mpz_class z = 1000000;
//cout << "value " << z << "\n";
cout << "value " << z.get_str() << "\n";
return 0;
}
6.解决了 哈哈哈
看到了这篇文章: vs2017使用gmp类库时输入输出符号无法解析外部符号
#include <iostream>
#include <gmp.h>
#include <gmpxx.h>
#pragma comment(lib,"libgmpxx.a")
#pragma comment(lib,"libgmp.a")
#pragma comment(lib,"libgcc.a")
#pragma comment(lib,"libmingwex.a")
#pragma comment(lib,"libmsvcrt.a")
嗯我好像没有处理添加的这个libgmpxx.a 这个玩意儿呀!!!
加上试试?
cmake_minimum_required(VERSION 3.13)
project(MyGMP)
set(CMAKE_CXX_STANDARD 11)
add_executable(MyGMP main.cpp)
# To use GMP, you need add two lines into you CMakeLists.txt
# You need find your GMP installed path firstly, and Then add them.
include_directories("/usr/local/include")
include_directories("/usr/local/lib")
target_link_libraries(MyGMP "/usr/local/lib/libgmp.a")
target_link_libraries(MyGMP "/usr/local/lib/libgmpxx.a")
ojbk!!! 哈哈 配了一晚上?
后来在看官方文档(官网可下载pdf版本)关于输入和输出的部分,他也说了是在libgmpxx中提供了这个功能。
10.3 C++ Formatted Output
The following functions are provided in libgmpxx (see Section 3.1 [Headers and Libraries], page 17), which is built if C++ support is enabled (see Section 2.1 [Build Options], page 3). Prototypes are available from <gmp.h>.