views:

1889

answers:

3

I am attempting to use the libtommath library. I'm using the NetBeans IDE for my project on Ubuntu linux. I have downloaded and built the library, I have done a 'make install' to put the resulting .a file into /usr/lib/ and the .h files into /usr/include

It appears to be finding the files appropriately (since I no longer get those errors, which I did before installing into the /usr directories).

However, when I create a simple main making a call to mp_init (which is in the library), I get the following error when I attempt to make my project:

mkdir -p build/Debug/GNU-Linux-x86
rm -f build/Debug/GNU-Linux-x86/main.o.d
gcc -c -g -MMD -MP -MF build/Debug/GNU-Linux-x86/main.o.d -o build/Debug/GNU-Linux-x86/main.o main.c
mkdir -p dist/Debug/GNU-Linux-x86
gcc -o dist/Debug/GNU-Linux-x86/cproj1 build/Debug/GNU-Linux-x86/main.o
build/Debug/GNU-Linux-x86/main.o: In function 'main':
/home/[[myusername]]/NetBeansProjects/CProj1/main.c:18: undefined reference to `mp_init'
collect2: ld returned 1 exit status
make[2]: *** [dist/Debug/GNU-Linux-x86/cproj1] Error 1

So, it looks like the linker can't find the function within the library, however it IS there, so I just don't know what could be causing this. Any help would be appreciated.

I get the same error if I type the gcc command directly and skip the makefile, I also made sure the static library got compiled with gcc as well.

Edited to Add:

I get these same errors if I do the compile directly and add the library with -l or -L:

$ gcc -l /usr/lib/libtommath.a main.c 
/usr/bin/ld: cannot find -l/usr/lib/libtommath.a
collect2: ld returned 1 exit status

$ gcc -llibtommath.a main.c 
/usr/bin/ld: cannot find -llibtommath.a
collect2: ld returned 1 exit status

$ gcc -Llibtommath.a main.c 
/tmp/ccOxzclw.o: In function `main':
main.c:(.text+0x18): undefined reference to `mp_init'
collect2: ld returned 1 exit status

$ gcc -Llibtommath.a main.c 
/tmp/ccOxzclw.o: In function `main':
main.c:(.text+0x18): undefined reference to `mp_init'
collect2: ld returned 1 exit status

I am very rusty on this stuff, so I'm not sure I'm using the right command here, in the -L examples are the libraries being found? If the library isn't being found how on earth do I get it to find the library? It's in /usr/lib, I've tried it with the .a file in the current directory, etc. Is there an environment variable I need to set? If so, how, etc.

Thanks so much for the help.

I've tried a completely different library (GMP) and had the EXACT same problem. This has got to be some kind of Ubuntu environment issue? Anyone have any idea how to fix this?

A: 

You're not linking the library with your program. Add -l<library name> (if it's called libtommath.a, then use -ltommath) to gcc -o dist/.../cproj1 build/.../main.o.

PiotrLegnica
I am including it. Maybe I'm not doing it right:$>gcc -llibtommath.a main.c /usr/bin/ld: cannot find -llibtommath.acollect2: ld returned 1 exit status(libtommath.a is in /usr/lib/)Or, I've tried: >$ gcc -Llibtommath.a main.c /tmp/ccOxzclw.o: In function `main':main.c:(.text+0x18): undefined reference to `mp_init'collect2: ld returned 1 exit statusSame result with -ltommath instead.
KU1
`-l` prepends `lib` and appends `.a`. So you should use `-ltommath`.
PiotrLegnica
A: 

I am so frustrated with this. This also doesn't work

$ gcc -static -L/usr/lib -I/usr/lib -ltommath main.c
/tmp/ccT6YiG3.o: In function `main':
main.c:(.text+0x18): undefined reference to `mp_init'
collect2: ld returned 1 exit status
KU1
You shouldn't add that as an answer, but rather edit the question, or use comments. And try `gcc -static -L/usr/lib -I/usr/lib main.c -ltommath` instead.
PiotrLegnica
A: 

The trick here is to put the library AFTER the module you are compiling. The problem is a reference thing. The linker resolves references in order, so when the library is BEFORE the module being compiled, the linker gets confused and does not think that any of the functions in the library are needed. By putting the library AFTER the module, the references to the library in the module are resolved by the linker.

David Wheeler