8

i just compiled chironfs on my new ubuntu 12.10 server and got the following error:

gcc  -Wall -W -Wmissing-prototypes -g -O2 -DFUSE_USE_VERSION=25 -D_FILE_OFFSET_BITS=64 -I/usr/local/include -g -O2 -lm -lfuse  -o chironfs chironfs.o chiron-conf.o chirondbg.o chironfn.o  
chironfs.o: In function `chiron_init':
/root/chironfs-1.1.1/src/chironfs.c:2000: undefined reference to `pthread_create'
chironfs.o: In function `get_rights_by_name':
/root/chironfs-1.1.1/src/chironfs.c:452: undefined reference to `fuse_get_context'

the pthread error tells me that -lpthread is missing, but the fuse error is kinda weird cause -lfuse is being used

i found a solution here which suggests to put libraries after object files

so i removed -lfuse and added -lfuse -lpthread at the very end of the line

now it compiles without an error and it seems that this is the way it should be: library after object files

my question is: why is the parameter order relevant for gcc/ld? i tought gcc just parses the params like every other application and may forward the necessary params to ld or such

in general: anyone knows facts or tips for gcc parameter ordering and maybe a bit background information about why it is needed this way?

thanks

John Doe
  • 2,746
  • 2
  • 35
  • 50

2 Answers2

12

The order of objects and libraries is relevant to the linker (called implicitly by the compiler when creating an executable). When the linker, in its left-to-right scan, finds a use of a name it doesn't know about it starts looking for a definition from that point on. If a definition passes by, it doesn't remember it for later use.

vonbrand
  • 11,412
  • 8
  • 32
  • 52
  • 2
    so in other words: the wrong example has the problem, that the linker finds fuse and pthreads but has no usage for them at that point he finds them, so he drops the libs. the working example tells the linker firstly that e.g. chironfs.o needs pthreads so the linker begins to search for it and finds it later, from the chironfs.o point, in the parameter list - same for fuse, right? – John Doe Feb 02 '13 at 19:48
  • 2
    @JohnDoe, exactly. Yes, the linker is dumb. Sorry, too late to make it smart now (much depends on its current behaviour). – vonbrand Feb 02 '13 at 19:58
2

GCC itself passes parameters to ld in relatively transparent fashion

Your question really is about how ld linker works. For simplicity and to handle circular references without infinite loops, it passes through the list of libraries only once, resolving references. So if your reference occurs somewhere and it hasn't seen the library that contains it yet then it's just an error.

Also please read this discussion, where this question is discussed in greater details.

Community
  • 1
  • 1
Konstantin Vladimirov
  • 6,791
  • 1
  • 27
  • 36