2014-07-08 13 views
5

Sono su un Mac e ho installato gcc e gmp tramite homebrew.C++ gmp e homebrew

per testare la mia installazione ho provato l'esempio semplice da 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; 
} 

Prima di tutto, se provo g++ test.cpp -lgmpxx -lgmp si lamenta

test.cpp:9:19: fatal error: gmpxx.h: No such file or directory 
#include <gmpxx.h> 
       ^
compilation terminated. 

Così ho cercato g++ test.cpp -lgmpxx -lgmp -I/usr/local/include/

ld: library not found for -lgmpxx 
collect2: error: ld returned 1 exit status 

Quindi, ho provato 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 

La cosa divertente è che se io commento le linee con cout e cerco g++ test.cpp -lgmpxx -lgmp -I/usr/local/include/ -L/usr/local/lib/ && ./a.out non ci sono lamentele. In particolare, la linea c = a+b; non ha bisogno di essere commentata, quindi mi sembra che qualcosa stia succedendo.

Cosa mi manca? Come posso ottenere il codice di esempio da compilare?

EDIT:

come da suggerimento @Will s', ho provato 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 

Se io sto capendo il messaggio di errore in modo corretto, sembra che le librerie sono state infatti costruite per 64- bit, e anche la dichiarazione mpz_class a, b, c non riuscirà a compilare con -m32.

+0

Does aggiungendo l'opzione '-m32' aiutare? Non ho l'env per mettermi alla prova, ma potrebbe essere che hai installato librerie a 32 bit? – Will

+0

@Will Grazie per il suggerimento, ma sfortunatamente l'interruttore non sembra risolvere il problema. Ho pubblicato il messaggio di errore in una modifica al mio post originale. – math4tots

+0

inserire il percorso del collegamento * prima * del nome della libreria, forse? 'g ++ -I/usr/local/include/-L/usr/local/lib/-lgmpxx -lgmp test.cpp' (ancora indovinando dal telefono) – Will

risposta