On Sunday, 11 October 2015, Matt Turner <<a href="mailto:mattst88@gmail.com">mattst88@gmail.com</a>> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On Sat, Oct 10, 2015 at 10:30 PM, Rhys Kidd <<a href="javascript:;" onclick="_e(event, 'cvml', 'rhyskidd@gmail.com')">rhyskidd@gmail.com</a>> wrote:<br>
> Patchset adds Makefile and documentation improvements.<br>
><br>
> I aimed to write these as I would have found most helpful when seeking to<br>
> understand shader-db's operation, as a new Mesa developer.<br>
><br>
> First patch resolves the build errors [0] experienced on Ubuntu 15.04 and<br>
> permit a simple 'make' to work if the dependencies are met. The following two<br>
> patches improve the documentation of those dependencies.<br>
><br>
> [0]<br>
> $ cc --version<br>
> cc (Ubuntu 4.9.2-10ubuntu13) 4.9.2<br>
> ...<br>
> $ make<br>
> cc -g -O2 -march=native -pipe -std=gnu99 -fopenmp  -lepoxy -lgbm  run.c   -o run<br>
> /tmp/ccaZrtAC.o: In function `main._omp_fn.0':<br>
> /home/usera/Coding/shader-db/run.c:511: undefined reference to `epoxy_eglBindAPI'<br>
<br>
I don't understand. It works fine locally with the exact same cc<br>
command, with every version of gcc I've used since November of last<br>
year.<br>
</blockquote><div><br></div><div>Hello Matt,</div><div><br></div><div>It is a link ordering issue in the shader-db Makefile prior to this change.</div><div><br></div><div>The key bits of the command are:</div><div><br></div><div>cc -g -O2 ... -lepoxy -lgbm ... [ ... the *.o file ... ]</div><div><br></div><div>The problem is that -lepoxy and -lgbm need to come after all the *.o files on the command line as passed to the linker, because order matters: libraries are only searched for unresolved symbols from object files that precede them on the command line.</div><div><br></div><div>This situation is commonly seen when libraries are incorrectly added to LDFLAGS. GNU Make is clear in the manual that LDFLAGS is only for:</div><div><br></div><div>    Extra flags to give to compilers when they are supposed to invoke the linker, 'ld', such as -L. Libraries (-lfoo) should be added to the LDLIBS variable instead.</div><div><br></div><div>We can of course use any variable, say LIBS, when pulling the libraries out of LDFLAGS. The important part though is that the variable is used after the *.o files when setting up the command line.</div><div><br></div><div>I'm not disputing that the current approach has worked for you on your setups thus far, just that it is brittle and not guaranteed to work per this explanation. I've provided details of at least one (reasonably vanilla) Ubuntu dev environment where breakage has been experienced.</div><div><br></div><div>I hope this has explained why the approach in the patch should be preferred.</div><div><br></div><div>Regards,</div><div>Rhys</div>