Library linking with GMP

I am trying to set up the gnu multiple precision arithmetic library for some c++ programming I have to do.
I am using a system with mac osx 10.6.3 and do NOT have root user access.
I'm trying to use gmp 5.0.1.
Since I don't have root user access, I had to install to a different directory
Thus I used

./configure --prefix=~/gmp --enable-cxx
make
make install

I also ran make check and it did not report any errors.

I then went to run a test program
Compiled with no errors using

g++ gmptest.cxx -I/Users/****/gmp/lib/ -I/Users/****/gmp/include/ -L/Users/****/gmp/lib/ -lgmpxx -lgmp -o gmptest

and tried to run with

./gmptest

The error I get is

dyld: Library not loaded: /usr/local/lib/libgmpxx.4.dylib
  Referenced from: /Users/****/./gmptest
  Reason: image not found
Trace/BPT trap

The gmptest.cxx test program is the following

#include <gmp.h>
#include <gmpxx.h>
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
using namespace std;
void foo (mpz_t result, const mpz_t param, unsigned long n) 
{
unsigned long i;
mpz_mul_ui (result, param, n);
for (i = 1; i < n; i++)
	mpz_add_ui (result, result, i*7);
}

int 
main () 
{
mpz_t r, n;
 mpz_init (r);
 mpz_init_set_str (n, "123456", 0);
 foo (r, n, 20L);
 gmp_printf ("%Zd\n", r);
 return 0;
}

It's just some program I found that should print out a number.. Not important what it does at this point, I just want it to run.

I understand the error is saying that it cant find the libgmpxx.4.dylib file in /usr/local/lib which makes sense because it isn't there. But I thought the -L and -I settings I put in the compiler options tell it to look there for the libraries, and that library DOES exist there.

What am I doing wrong? Did I miss something?

Edit:
I also checked otool -L gmptest and it shows libgmpxx.4.dylib and libgmp.10.dylib linked from /usr/local/lib . They do NOT exist in this directory, they exist in /Users/****/gmp/lib where I thought I had told it to look.

Hi.

I have no experience with gmp, and little with c++. However, I had been looking at ld today, and thought I would try a few things.

Briefly, I downloaded gmp 5.x from gnu.org, compiled it with your .configure line (into ~/gmp), ran make, make check, make install. Then I created a script, s1, to try the test code compile, link, execute. The (lengthy) results are below in 3 sections: my environment, the script, and the "link trace" compile, link, execute.

OS, ker|rel, machine: Linux, 2.6.26-2-686, i686
Distribution        : Debian GNU/Linux 5.0 
g++ (Debian 4.3.2-1.1) 4.3.2
GNU ld (GNU Binutils for Debian) 2.18.0.20080103

-----

#!/usr/bin/env bash

# g++ gmptest.cxx -I/Users/****/gmp/lib/ -I/Users/****/gmp/include/ -L/Users/****/gmp/lib/ -lgmpxx -lgmp -o gmptest

my_gmp=/home/drl/gmp
# g++ -t t1.cpp -I$my_gmp/lib -I$my_gmp/include -L$my_gmp/lib -lgmpxx -lgmp -o gmptest
# g++ -t t1.cpp -I$my_gmp/lib -I$my_gmp/include -L$my_gmp/lib -o gmptest
# g++ -t t1.cpp -I$my_gmp/lib -I$my_gmp/include "-Wl,-rpath $my_gmp/lib/" -o gmptest
# g++ -t t1.cpp -I$my_gmp/include "-Wl,-R $my_gmp/lib/" -o gmptest
# fails, g++ -t t1.cpp -I$my_gmp/include $my_gmp/lib/*.so -o gmptest
# works, g++ -t t1.cpp -I$my_gmp/include $my_gmp/lib/*.a -o gmptest
g++ -t t1.cpp -I$my_gmp/include $my_gmp/lib/*.a -o gmptest

./gmptest

-----

/usr/bin/ld: mode elf_i386
/usr/lib/gcc/i486-linux-gnu/4.3.2/../../../../lib/crt1.o
/usr/lib/gcc/i486-linux-gnu/4.3.2/../../../../lib/crti.o
/usr/lib/gcc/i486-linux-gnu/4.3.2/crtbegin.o
/tmp/cc5l0KO5.o
(/home/drl/gmp/lib/libgmp.a)lt3-add_ui.o
(/home/drl/gmp/lib/libgmp.a)lt22-init.o
(/home/drl/gmp/lib/libgmp.a)lt29-iset_str.o
(/home/drl/gmp/lib/libgmp.a)lt33-mul_ui.o
(/home/drl/gmp/lib/libgmp.a)realloc.o
(/home/drl/gmp/lib/libgmp.a)lt43-set_str.o
(/home/drl/gmp/lib/libgmp.a)mp_bases.o
(/home/drl/gmp/lib/libgmp.a)mul_1.o
(/home/drl/gmp/lib/libgmp.a)lt88-set_str.o
(/home/drl/gmp/lib/libgmp.a)printf.o
(/home/drl/gmp/lib/libgmp.a)printffuns.o
(/home/drl/gmp/lib/libgmp.a)assert.o
(/home/drl/gmp/lib/libgmp.a)memory.o
(/home/drl/gmp/lib/libgmp.a)mp_dv_tab.o
(/home/drl/gmp/lib/libgmp.a)tal-reent.o
(/home/drl/gmp/lib/libgmp.a)add_n.o
(/home/drl/gmp/lib/libgmp.a)dive_1.o
(/home/drl/gmp/lib/libgmp.a)lt82-mul.o
(/home/drl/gmp/lib/libgmp.a)mul_n.o
(/home/drl/gmp/lib/libgmp.a)sqr.o
(/home/drl/gmp/lib/libgmp.a)mul_basecase.o
(/home/drl/gmp/lib/libgmp.a)sqr_basecase.o
(/home/drl/gmp/lib/libgmp.a)nussbaumer_mul.o
(/home/drl/gmp/lib/libgmp.a)toom22_mul.o
(/home/drl/gmp/lib/libgmp.a)toom32_mul.o
(/home/drl/gmp/lib/libgmp.a)toom42_mul.o
(/home/drl/gmp/lib/libgmp.a)toom33_mul.o
(/home/drl/gmp/lib/libgmp.a)toom43_mul.o
(/home/drl/gmp/lib/libgmp.a)toom53_mul.o
(/home/drl/gmp/lib/libgmp.a)toom63_mul.o
(/home/drl/gmp/lib/libgmp.a)toom44_mul.o
(/home/drl/gmp/lib/libgmp.a)toom6h_mul.o
(/home/drl/gmp/lib/libgmp.a)toom6_sqr.o
(/home/drl/gmp/lib/libgmp.a)toom8h_mul.o
(/home/drl/gmp/lib/libgmp.a)toom8_sqr.o
(/home/drl/gmp/lib/libgmp.a)toom_couple_handling.o
(/home/drl/gmp/lib/libgmp.a)toom2_sqr.o
(/home/drl/gmp/lib/libgmp.a)toom3_sqr.o
(/home/drl/gmp/lib/libgmp.a)toom_eval_dgr3_pm1.o
(/home/drl/gmp/lib/libgmp.a)toom_eval_dgr3_pm2.o
(/home/drl/gmp/lib/libgmp.a)toom_eval_pm1.o
(/home/drl/gmp/lib/libgmp.a)toom_eval_pm2.o
(/home/drl/gmp/lib/libgmp.a)toom_eval_pm2exp.o
(/home/drl/gmp/lib/libgmp.a)toom_eval_pm2rexp.o
(/home/drl/gmp/lib/libgmp.a)toom_interpolate_5pts.o
(/home/drl/gmp/lib/libgmp.a)toom_interpolate_6pts.o
(/home/drl/gmp/lib/libgmp.a)toom_interpolate_7pts.o
(/home/drl/gmp/lib/libgmp.a)toom_interpolate_8pts.o
(/home/drl/gmp/lib/libgmp.a)toom_interpolate_12pts.o
(/home/drl/gmp/lib/libgmp.a)toom_interpolate_16pts.o
(/home/drl/gmp/lib/libgmp.a)mulmod_bnm1.o
(/home/drl/gmp/lib/libgmp.a)sqrmod_bnm1.o
(/home/drl/gmp/lib/libgmp.a)bdiv_dbm1c.o
(/home/drl/gmp/lib/libgmp.a)copyi.o
(/home/drl/gmp/lib/libgmp.a)addlsh1_n.o
(/home/drl/gmp/lib/libgmp.a)rsh1add_n.o
(/home/drl/gmp/lib/libgmp.a)doprnt.o
(/home/drl/gmp/lib/libgmp.a)doprntf.o
(/home/drl/gmp/lib/libgmp.a)doprnti.o
(/home/drl/gmp/lib/libgmp.a)mp_minv_tab.o
(/home/drl/gmp/lib/libgmp.a)set_si.o
(/home/drl/gmp/lib/libgmp.a)get_str.o
(/home/drl/gmp/lib/libgmp.a)lt20-get_str.o
(/home/drl/gmp/lib/libgmp.a)lt42-set_si.o
(/home/drl/gmp/lib/libgmp.a)lt60-get_str.o
(/home/drl/gmp/lib/libgmp.a)lt68-set_si.o
(/home/drl/gmp/lib/libgmp.a)sub_n.o
(/home/drl/gmp/lib/libgmp.a)addmul_1.o
(/home/drl/gmp/lib/libgmp.a)submul_1.o
(/home/drl/gmp/lib/libgmp.a)lshift.o
(/home/drl/gmp/lib/libgmp.a)rshift.o
(/home/drl/gmp/lib/libgmp.a)mul_fft.o
(/home/drl/gmp/lib/libgmp.a)lt87-get_str.o
(/home/drl/gmp/lib/libgmp.a)lt98-tdiv_qr.o
(/home/drl/gmp/lib/libgmp.a)sbpi1_div_qr.o
(/home/drl/gmp/lib/libgmp.a)dcpi1_div_qr.o
(/home/drl/gmp/lib/libgmp.a)mu_div_qr.o
(/home/drl/gmp/lib/libgmp.a)copyd.o
(/home/drl/gmp/lib/libgmp.a)invert_limb.o
(/home/drl/gmp/lib/libgmp.a)errno.o
(/home/drl/gmp/lib/libgmp.a)mp_bpl.o
(/home/drl/gmp/lib/libgmp.a)divrem_1.o
(/home/drl/gmp/lib/libgmp.a)divrem_2.o
(/home/drl/gmp/lib/libgmp.a)lshiftc.o
(/home/drl/gmp/lib/libgmp.a)invertappr.o
(/home/drl/gmp/lib/libgmp.a)sbpi1_divappr_q.o
-lstdc++ (/usr/lib/gcc/i486-linux-gnu/4.3.2/libstdc++.so)
-lm (/usr/lib/gcc/i486-linux-gnu/4.3.2/../../../../lib/libm.so)
-lgcc_s (/usr/lib/gcc/i486-linux-gnu/4.3.2/libgcc_s.so)
/lib/libc.so.6
(/usr/lib/libc_nonshared.a)elf-init.oS
/lib/ld-linux.so.2
-lgcc_s (/usr/lib/gcc/i486-linux-gnu/4.3.2/libgcc_s.so)
/usr/lib/gcc/i486-linux-gnu/4.3.2/crtend.o
/usr/lib/gcc/i486-linux-gnu/4.3.2/../../../../lib/crtn.o
2470450

At first I thought the link had included everything in libgmp.a, but there are 450+ entries (according to nm | grep T | wc, and ar t | wc), so I concluded it was a selective link.

I am not using OS X, but I'd guess it's worth a try to do it this way if you cannot install into /lib, /usr/lib.

Good luck ... cheers, drl

1 Like

Thanks,
That seems to work perfectly. I hadn't known about the -t option, that seems to be the way to go.

Hi.

You're welcome. You can remove the "-t" -- that was for tracing the linker behavior: education and debugging ... cheers, drl