Tôi đang sử dụng máy Mac và tôi đã cài đặt gcc
và gmp
đến homebrew
.C++ gmp và homebrew
Để kiểm tra các cài đặt của tôi, tôi đã cố gắng ra ví dụ đơn giản từ here:
#include <iostream>
#include <gmpxx.h>
using namespace std;
int
main (void)
{
mpz_class a, b, c;
a = 1234;
b = "-5678";
c = a+b;
cout << "sum is " << c << "\n";
cout << "absolute value is " << abs(c) << "\n";
return 0;
}
Trước hết, nếu tôi cố gắng g++ test.cpp -lgmpxx -lgmp
nó than phiền
test.cpp:9:19: fatal error: gmpxx.h: No such file or directory
#include <gmpxx.h>
^
compilation terminated.
Vì vậy, tôi đã cố gắng g++ test.cpp -lgmpxx -lgmp -I/usr/local/include/
ld: library not found for -lgmpxx
collect2: error: ld returned 1 exit status
Vì vậy, sau đó tôi đã thử g++ test.cpp -lgmpxx -lgmp -I/usr/local/include/ -L/usr/local/lib/
Undefined symbols for architecture x86_64:
"operator<<(std::basic_ostream<char, std::char_traits<char> >&, __mpz_struct const*)", referenced from:
std::basic_ostream<char, std::char_traits<char> >& operator<< <__mpz_struct [1], __mpz_struct [1]>(std::basic_ostream<char, std::char_traits<char> >&, __gmp_expr<__mpz_struct [1], __mpz_struct [1]> const&) in ccPugkZ3.o
std::basic_ostream<char, std::char_traits<char> >& operator<< <__mpz_struct [1], __gmp_unary_expr<__gmp_expr<__mpz_struct [1], __mpz_struct [1]>, __gmp_abs_function> >(std::basic_ostream<char, std::char_traits<char> >&, __gmp_expr<__mpz_struct [1], __gmp_unary_expr<__gmp_expr<__mpz_struct [1], __mpz_struct [1]>, __gmp_abs_function> > const&) in ccPugkZ3.o
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status
Điều buồn cười là nếu tôi nhận xét ra các dòng với cout
và thử g++ test.cpp -lgmpxx -lgmp -I/usr/local/include/ -L/usr/local/lib/ && ./a.out
không có khiếu nại. Đặc biệt dòng c = a+b;
không cần phải được nhận xét, vì vậy tôi cảm thấy như một cái gì đó dường như đang xảy ra.
Tôi đang thiếu gì? Làm thế nào tôi có thể lấy mã mẫu để biên dịch?
EDIT:
theo gợi ý @ Will 's, tôi đã cố gắng g++ test.cpp -lgmpxx -lgmp -I/usr/local/include/ -L/usr/local/lib/ -m32
ld: warning: ld: warning: ignoring file /usr/local/lib//libgmpxx.dylib, file was built for x86_64 which is not the architecture being linked (i386): /usr/local/lib//libgmpxx.dylibignoring file /usr/local/lib//libgmp.dylib, file was built for x86_64 which is not the architecture being linked (i386): /usr/local/lib//libgmp.dylib
Undefined symbols for architecture i386:
"operator<<(std::basic_ostream<char, std::char_traits<char> >&, __mpz_struct const*)", referenced from:
std::basic_ostream<char, std::char_traits<char> >& operator<< <__mpz_struct [1], __mpz_struct [1]>(std::basic_ostream<char, std::char_traits<char> >&, __gmp_expr<__mpz_struct [1], __mpz_struct [1]> const&) in ccrPv2wC.o
std::basic_ostream<char, std::char_traits<char> >& operator<< <__mpz_struct [1], __gmp_unary_expr<__gmp_expr<__mpz_struct [1], __mpz_struct [1]>, __gmp_abs_function> >(std::basic_ostream<char, std::char_traits<char> >&, __gmp_expr<__mpz_struct [1], __gmp_unary_expr<__gmp_expr<__mpz_struct [1], __mpz_struct [1]>, __gmp_abs_function> > const&) in ccrPv2wC.o
"___gmpz_abs", referenced from:
__gmp_abs_function::eval(__mpz_struct*, __mpz_struct const*) in ccrPv2wC.o
"___gmpz_add", referenced from:
__gmp_binary_plus::eval(__mpz_struct*, __mpz_struct const*, __mpz_struct const*) in ccrPv2wC.o
"___gmpz_clear", referenced from:
__gmp_expr<__mpz_struct [1], __mpz_struct [1]>::~__gmp_expr() in ccrPv2wC.o
"___gmpz_init", referenced from:
__gmp_expr<__mpz_struct [1], __mpz_struct [1]>::__gmp_expr() in ccrPv2wC.o
__gmp_expr<__mpz_struct [1], __mpz_struct [1]>::__gmp_expr<__gmp_unary_expr<__gmp_expr<__mpz_struct [1], __mpz_struct [1]>, __gmp_abs_function> >(__gmp_expr<__mpz_struct [1], __gmp_unary_expr<__gmp_expr<__mpz_struct [1], __mpz_struct [1]>, __gmp_abs_function> > const&) in ccrPv2wC.o
"___gmpz_set_si", referenced from:
__gmp_expr<__mpz_struct [1], __mpz_struct [1]>::assign_si(long) in ccrPv2wC.o
"___gmpz_set_str", referenced from:
__gmp_expr<__mpz_struct [1], __mpz_struct [1]>::operator=(char const*) in ccrPv2wC.o
ld: symbol(s) not found for architecture i386
collect2: error: ld returned 1 exit status
Nếu tôi hiểu được thông báo lỗi một cách chính xác, có vẻ như các thư viện đã thực sự xây dựng cho 64 bit, và thậm chí khai báo mpz_class a, b, c
sẽ không biên dịch được với -m32
.
Có thêm công tắc '-m32' giúp không? Tôi không có env để kiểm tra bản thân mình, nhưng nó có thể là bạn đã cài đặt 32 bit libs? – Will
@Will Cảm ơn bạn đã đề xuất, nhưng tiếc là chuyển đổi dường như không giải quyết được vấn đề. Tôi đã đăng thông báo lỗi trong bản chỉnh sửa cho bài đăng gốc của mình. – math4tots
đặt đường dẫn liên kết * trước * tên thư viện có lẽ? 'g ++ -I/usr/local/include/-L/usr/local/lib/-lgmpxx -lgmp test.cpp' (vẫn đoán từ điện thoại) – Will