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
.
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
@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
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