2014-07-08 12 views
5

Tôi đang sử dụng máy Mac và tôi đã cài đặt gccgmp đế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.

+0

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

+0

@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

+0

đặ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

Trả lời