Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

c++ undefined references with static library

I'm trying to make a static library from a class but when trying to use it, I always get errors with undefined references on anything. The way I proceeded was creating the object file like

g++ -c myClass.cpp -o myClass.o 

and then packing it with

ar rcs myClass.lib myClass.o 

There is something I'm obviously missing generally with this. I bet it's something with symbols. Thanks for any advice, I know it's most probably something I could find out if reading some tutorial so sorry if bothering with stupid stuff again :)

edit:

myClass.h:

class myClass{     public:         myClass();         void function(); }; 

myClass.cpp:

#include "myClass.h"  myClass::myClass(){} void myClass::function(){} 

program using the class:

#include "myClass.h"  int main(){ myClass mc; mc.function();  return 0; } 

finally I compile it like this:

g++ -o main.exe -L. -l myClass main.cpp 

the error is just classic:

C:\Users\RULERO~1\AppData\Local\Temp/ccwM3vLy.o:main.cpp:(.text+0x31): undefined  reference to `myClass::myClass()' C:\Users\RULERO~1\AppData\Local\Temp/ccwM3vLy.o:main.cpp:(.text+0x3c): undefined  reference to `myClass::function()' collect2: ld returned 1 exit status 
like image 291
Pyjong Avatar asked Apr 12 '10 18:04

Pyjong


2 Answers

This is probably a link order problem. When the GNU linker sees a library, it discards all symbols that it doesn't need. In this case, your library appears before your .cpp file, so the library is being discarded before the .cpp file is compiled. Do this:

g++ -o main.exe main.cpp -L. -lmylib 

or

g++ -o main.exe main.cpp myClass.lib 

The Microsoft linker doesn't consider the ordering of the libraries on the command line.

like image 68
mch Avatar answered Sep 21 '22 00:09

mch


Another possible cause: forgetting extern "C".

I ran into this because I was trying to link a C++ program with a C static library. The library's header didn't have extern "C" so the linker was looking for a mangled function name, and the library actually had the unmangled function name.

It took a while to figure out what was going on, so I hope this helps someone else.

like image 21
tprk77 Avatar answered Sep 20 '22 00:09

tprk77