0

I am working with c++ code for a physics simulation, which uses a lot of external libraries (like GSL and cern`s ROOT). Trying to recompile project I encountered problems with linking. When running compilation of final file via:

g++ -fno-inline -O2 -fpic -o main.out ${ROOTINCS} main.o ext.o ${ROOTLIBS} $(objects2)

with :

  • objects2= many .o files made by us
  • ROOTLIBS=-L/usr/local/lib/root -lTree -lRIO -lNet -lHist -lMathCore -lCore -lGraf -lGraf3d -lGpad -lMatrix -lThread -lCint -lPhysics -lPostscript -lRint -lSpectrum -lg
  • ROOTINCS=-pthread -m64

I get annoying error:

/usr/bin/ld: /usr/local/lib/root/libHist.so: undefined reference to symbol 'gRandom'

/usr/local/lib/root/libMathCore.so: error adding symbols: DSO missing from command line

collect2: error: ld returned 1 exit status

The problem is nm -C run on libMathCore states 'gRandom' is declared there. Also -lMathCore is present in my command line.

When I run ld to check if it understands the flag:

ld -L/usr/local/lib/root -lMathCore --verbose 2>/dev/null

it does not complain and tries to link properly.

According to https://stackoverflow.com/a/24675715/3602168 order of libraries is correct in my linking (libHist uses libMathCOre and therefore is stated first).

Compilation runs under g++ 4.8.2 on ubuntu 14.04, 64 bit

Community
  • 1
  • 1
Picek
  • 63
  • 6
  • Have you tried moving `$(objects2)` before `${ROOTLIBS}`? I think the issue may be that you have libraries specified before the object files that use them. – clstrfsck Aug 16 '14 at 22:45

1 Answers1

0

Converting comment to answer:

Have you tried moving $(objects2) before ${ROOTLIBS}? I think the issue may be that you have libraries specified before the object files that use them.

clstrfsck
  • 14,715
  • 4
  • 44
  • 59