Trying to include a library, but keep getting 'undefined reference to' messages
Asked Answered
P

4

97

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.

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.

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?

Pearce answered 4/10, 2009 at 19:5 Comment(1)
L
207

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.

Lay answered 21/3, 2010 at 16:8 Comment(7)
+1 Oh, thank you! I know link resolve order makes perfect sense, but it really helps to be reminded of these facts!Loughlin
This worked for me. My very old makefile used to work, but now it seems the compiler is getting too smart for its own good :)Hyetal
I'm not voting to duplicate another question: #12749337 because that answer adds one detail: "Recent versions of GCC reuqire that you put the object files and libraries in the order that they depend on each other".Ribaldry
I'd like to upvote you 1000 times - I've spent days trying to get my project to link, and your solution was the fix!Guffey
2020 and still relevantMccartan
OMG! I wasted a whole day on an interview assignment on this! They gave me the assignment on an ubuntu box using cc with LIB before the modules! I could not get it to build. I copied it to a MacOS box that uses clang and it compiled no problem! I then wasted a whole day trying to get it to compile on the original ubuntu box. I edited their Makefile and put the libs at the end and it instantly worked! OMG! Seriously still an issue in 2020!Transplant
2022 and still relevantDysgenics
J
53

Yes, It is required to add libraries after the source files/objects files. This command will solve the problem:

gcc -static -L/usr/lib -I/usr/lib main.c -ltommath
Ji answered 14/1, 2011 at 9:15 Comment(1)
+1 for writing the correct way to link against libtommath.aLoughlin
H
9

If the .c source files are converted .cpp (like as in parsec), then the extern needs to be followed by "C" as in

extern "C" void foo();
Hid answered 15/2, 2017 at 1:13 Comment(0)
O
0

check for missing lib in your path

Omen answered 19/4, 2023 at 21:14 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.