gcc/g++ parameter order

2020-04-08 11:28发布

问题:

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

回答1:

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.



回答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.