Opened 8 years ago
Closed 5 years ago
#6443 closed defect (wontfix)
Change linking order in apps/GNUmakefile
Reported by: | springmeyer | Owned by: | warmerdam |
---|---|---|---|
Priority: | normal | Milestone: | closed_because_of_github_migration |
Component: | default | Version: | unspecified |
Severity: | normal | Keywords: | |
Cc: |
Description
In apps/GNUmakefile the $(LNK_FLAGS) come directly after the linker and before $(CONFIG_LIBS). This makes it impossible to pass custom LDFLAGS that include static archives on linux. Because the linux linker needs to resolve symbols in order the link flags need to come after 'libgdal.a' (which I presume comes in from $(CONFIG_LIBS)) on the linker line.
I see errors like:
libtool: link: clang++-3.5 gdallocationinfo.o -o gdallocationinfo /home/travis/build/mapbox/mason/mason_packages/linux-x86_64/libpq/9.5.2/lib/libpq.a /home/travis/build/mapbox/mason/mason_packages/.build/gdal-2.0.2/.libs/libgdal.a -L/home/travis/build/mapbox/mason/mason_packages/linux-x86_64/proj/4.9.2/lib -L/home/travis/build/mapbox/mason/mason_packages/linux-x86_64/expat/2.1.1/lib -L/home/travis/build/mapbox/mason/mason_packages/linux-x86_64/jpeg_turbo/1.4.2 -L/home/travis/build/mapbox/mason/mason_packages/linux-x86_64/jpeg_turbo/1.4.2/lib -L/home/travis/build/mapbox/mason/mason_packages/linux-x86_64/libtiff/4.0.6/lib -L/home/travis/build/mapbox/mason/mason_packages/linux-x86_64/libpng/1.6.21 -L/home/travis/build/mapbox/mason/mason_packages/linux-x86_64/libpng/1.6.21/lib -L/home/travis/build/mapbox/mason/mason_packages/linux-x86_64/zlib/system -L/home/travis/build/mapbox/mason/mason_packages/linux-x86_64/zlib/system/lib -lpthread -lrt -ldl /home/travis/build/mapbox/mason/mason_packages/linux-x86_64/libtiff/4.0.6/lib/libtiff.a -L/usr/lib /home/travis/build/mapbox/mason/mason_packages/linux-x86_64/jpeg_turbo/1.4.2/lib/libjpeg.a /home/travis/build/mapbox/mason/mason_packages/linux-x86_64/proj/4.9.2/lib/libproj.a /home/travis/build/mapbox/mason/mason_packages/linux-x86_64/libpng/1.6.21/lib/libpng16.a -lm -lz /home/travis/build/mapbox/mason/mason_packages/linux-x86_64/expat/2.1.1/lib/libexpat.a -pthread /home/travis/build/mapbox/mason/mason_packages/.build/gdal-2.0.2/.libs/libgdal.a(postgisrasterdataset.o): In function `PostGISRasterDataset::HasSpatialIndex()': postgisrasterdataset.cpp:(.text+0x9d8): undefined reference to `PQexec' postgisrasterdataset.cpp:(.text+0xa00): undefined reference to `PQresultStatus' postgisrasterdataset.cpp:(.text+0xa1f): undefined reference to `PQntuples' postgisrasterdataset.cpp:(.text+0xad4): undefined reference to `PQclear'
A proposed fix is:
diff --git a/apps/GNUmakefile b/apps/GNUmakefile index 2f6b749..7d8059c 100644 --- a/apps/GNUmakefile +++ b/apps/GNUmakefile @@ -44,97 +44,97 @@ lib-depend: (cd ../port ; $(MAKE) ) gdalinfo$(EXE): gdalinfo.$(OBJ_EXT) commonutils.$(OBJ_EXT) $(DEP_LIBS) - $(LD) $(LNK_FLAGS) $< commonutils.$(OBJ_EXT) $(XTRAOBJ) $(CONFIG_LIBS) -o $@ + $(LD) $< commonutils.$(OBJ_EXT) $(XTRAOBJ) $(CONFIG_LIBS) -o $@ $(LNK_FLAGS) gdalserver$(EXE): gdalserver.$(OBJ_EXT) $(DEP_LIBS) - $(LD) $(LNK_FLAGS) $< $(XTRAOBJ) $(CONFIG_LIBS) -o $@ + $(LD) $< $(XTRAOBJ) $(CONFIG_LIBS) -o $@ $(LNK_FLAGS) gdal_translate$(EXE): gdal_translate.$(OBJ_EXT) commonutils.$(OBJ_EXT) $(DEP_LIBS) - $(LD) $(LNK_FLAGS) $< commonutils.$(OBJ_EXT) $(XTRAOBJ) $(CONFIG_LIBS) -o $@ + $(LD) $< commonutils.$(OBJ_EXT) $(XTRAOBJ) $(CONFIG_LIBS) -o $@ $(LNK_FLAGS) gdaladdo$(EXE): gdaladdo.$(OBJ_EXT) $(DEP_LIBS) - $(LD) $(LNK_FLAGS) $< $(XTRAOBJ) $(CONFIG_LIBS) -o $@ + $(LD) $< $(XTRAOBJ) $(CONFIG_LIBS) -o $@ $(LNK_FLAGS) gdalwarp$(EXE): gdalwarp.$(OBJ_EXT) commonutils.$(OBJ_EXT) $(DEP_LIBS) - $(LD) $(LNK_FLAGS) $< commonutils.$(OBJ_EXT) $(XTRAOBJ) $(CONFIG_LIBS) -o $@ + $(LD) $< commonutils.$(OBJ_EXT) $(XTRAOBJ) $(CONFIG_LIBS) -o $@ $(LNK_FLAGS) gdal_contour$(EXE): gdal_contour.$(OBJ_EXT) $(DEP_LIBS) - $(LD) $(LNK_FLAGS) $< $(XTRAOBJ) $(CONFIG_LIBS) -o $@ + $(LD) $< $(XTRAOBJ) $(CONFIG_LIBS) -o $@ $(LNK_FLAGS) nearblack$(EXE): nearblack.$(OBJ_EXT) commonutils.$(OBJ_EXT) $(DEP_LIBS) - $(LD) $(LNK_FLAGS) $< commonutils.$(OBJ_EXT) $(XTRAOBJ) $(CONFIG_LIBS) -o $@ + $(LD) $< commonutils.$(OBJ_EXT) $(XTRAOBJ) $(CONFIG_LIBS) -o $@ $(LNK_FLAGS) gdalmanage$(EXE): gdalmanage.$(OBJ_EXT) $(DEP_LIBS) - $(LD) $(LNK_FLAGS) $< $(XTRAOBJ) $(CONFIG_LIBS) -o $@ + $(LD) $< $(XTRAOBJ) $(CONFIG_LIBS) -o $@ $(LNK_FLAGS) gdal_rasterize$(EXE): gdal_rasterize.$(OBJ_EXT) commonutils.$(OBJ_EXT) $(DEP_LIBS) - $(LD) $(LNK_FLAGS) $< commonutils.$(OBJ_EXT) $(XTRAOBJ) $(CONFIG_LIBS) -o $@ + $(LD) $< commonutils.$(OBJ_EXT) $(XTRAOBJ) $(CONFIG_LIBS) -o $@ $(LNK_FLAGS) gdaltindex$(EXE): gdaltindex.$(OBJ_EXT) $(DEP_LIBS) - $(LD) $(LNK_FLAGS) $< $(XTRAOBJ) $(CONFIG_LIBS) -o $@ + $(LD) $< $(XTRAOBJ) $(CONFIG_LIBS) -o $@ $(LNK_FLAGS) gdalbuildvrt$(EXE): gdalbuildvrt.$(OBJ_EXT) $(DEP_LIBS) - $(LD) $(LNK_FLAGS) $< $(XTRAOBJ) $(CONFIG_LIBS) -o $@ + $(LD) $< $(XTRAOBJ) $(CONFIG_LIBS) -o $@ $(LNK_FLAGS) multireadtest$(EXE): multireadtest.$(OBJ_EXT) $(DEP_LIBS) - $(LD) $(LNK_FLAGS) $< $(XTRAOBJ) $(CONFIG_LIBS) -o $@ + $(LD) $< $(XTRAOBJ) $(CONFIG_LIBS) -o $@ $(LNK_FLAGS) dumpoverviews$(EXE): dumpoverviews.$(OBJ_EXT) $(DEP_LIBS) - $(LD) $(LNK_FLAGS) $< $(XTRAOBJ) $(CONFIG_LIBS) -o $@ + $(LD) $< $(XTRAOBJ) $(CONFIG_LIBS) -o $@ $(LNK_FLAGS) gdalenhance$(EXE): gdalenhance.$(OBJ_EXT) commonutils.$(OBJ_EXT) $(DEP_LIBS) - $(LD) $(LNK_FLAGS) $< commonutils.$(OBJ_EXT) $(XTRAOBJ) $(CONFIG_LIBS) -o $@ + $(LD) $< commonutils.$(OBJ_EXT) $(XTRAOBJ) $(CONFIG_LIBS) -o $@ $(LNK_FLAGS) gdaldem$(EXE): gdaldem.$(OBJ_EXT) commonutils.$(OBJ_EXT) $(DEP_LIBS) - $(LD) $(LNK_FLAGS) $< commonutils.$(OBJ_EXT) $(XTRAOBJ) $(CONFIG_LIBS) -o $@ + $(LD) $< commonutils.$(OBJ_EXT) $(XTRAOBJ) $(CONFIG_LIBS) -o $@ $(LNK_FLAGS) gdal_grid$(EXE): gdal_grid.$(OBJ_EXT) commonutils.$(OBJ_EXT) $(DEP_LIBS) - $(LD) $(LNK_FLAGS) $< commonutils.$(OBJ_EXT) $(XTRAOBJ) $(CONFIG_LIBS) -o $@ + $(LD) $< commonutils.$(OBJ_EXT) $(XTRAOBJ) $(CONFIG_LIBS) -o $@ $(LNK_FLAGS) gdalwarpsimple$(EXE): gdalwarpsimple.$(OBJ_EXT) $(DEP_LIBS) - $(LD) $(LNK_FLAGS) $< $(XTRAOBJ) $(CONFIG_LIBS) -o $@ + $(LD) $< $(XTRAOBJ) $(CONFIG_LIBS) -o $@ $(LNK_FLAGS) gdaltransform$(EXE): gdaltransform.$(OBJ_EXT) $(DEP_LIBS) - $(LD) $(LNK_FLAGS) $< $(XTRAOBJ) $(CONFIG_LIBS) -o $@ + $(LD) $< $(XTRAOBJ) $(CONFIG_LIBS) -o $@ $(LNK_FLAGS) gdallocationinfo$(EXE): gdallocationinfo.$(OBJ_EXT) $(DEP_LIBS) - $(LD) $(LNK_FLAGS) $< $(XTRAOBJ) $(CONFIG_LIBS) -o $@ + $(LD) $< $(XTRAOBJ) $(CONFIG_LIBS) -o $@ $(LNK_FLAGS) gdalsrsinfo$(EXE): gdalsrsinfo.$(OBJ_EXT) commonutils.$(OBJ_EXT) $(DEP_LIBS) - $(LD) $(LNK_FLAGS) $< commonutils.$(OBJ_EXT) $(XTRAOBJ) $(CONFIG_LIBS) -o $@ + $(LD) $< commonutils.$(OBJ_EXT) $(XTRAOBJ) $(CONFIG_LIBS) -o $@ $(LNK_FLAGS) gdalflattenmask$(EXE): gdalflattenmask.$(OBJ_EXT) $(DEP_LIBS) - $(LD) $(LNK_FLAGS) $< $(XTRAOBJ) $(CONFIG_LIBS) -o $@ + $(LD) $< $(XTRAOBJ) $(CONFIG_LIBS) -o $@ $(LNK_FLAGS) gdaltorture$(EXE): gdaltorture.$(OBJ_EXT) $(DEP_LIBS) - $(LD) $(LNK_FLAGS) $< $(XTRAOBJ) $(CONFIG_LIBS) -o $@ + $(LD) $< $(XTRAOBJ) $(CONFIG_LIBS) -o $@ $(LNK_FLAGS) gdal2ogr$(EXE): gdal2ogr.$(OBJ_EXT) $(DEP_LIBS) - $(LD) $(LNK_FLAGS) $< $(XTRAOBJ) $(CONFIG_LIBS) -o $@ + $(LD) $< $(XTRAOBJ) $(CONFIG_LIBS) -o $@ $(LNK_FLAGS) ogrinfo$(EXE): ogrinfo.$(OBJ_EXT) commonutils.$(OBJ_EXT) $(DEP_LIBS) - $(LD) $(LNK_FLAGS) $< commonutils.$(OBJ_EXT) $(XTRAOBJ) $(CONFIG_LIBS) -o $@ + $(LD) $< commonutils.$(OBJ_EXT) $(XTRAOBJ) $(CONFIG_LIBS) -o $@ $(LNK_FLAGS) ogrlineref$(EXE): ogrlineref.$(OBJ_EXT) commonutils.$(OBJ_EXT) $(DEP_LIBS) - $(LD) $(LNK_FLAGS) $< commonutils.$(OBJ_EXT) $(XTRAOBJ) $(CONFIG_LIBS) -o $@ + $(LD) $< commonutils.$(OBJ_EXT) $(XTRAOBJ) $(CONFIG_LIBS) -o $@ $(LNK_FLAGS) ogr2ogr$(EXE): ogr2ogr.$(OBJ_EXT) commonutils.$(OBJ_EXT) $(DEP_LIBS) - $(LD) $(LNK_FLAGS) $< commonutils.$(OBJ_EXT) $(XTRAOBJ) $(CONFIG_LIBS) -o $@ + $(LD) $< commonutils.$(OBJ_EXT) $(XTRAOBJ) $(CONFIG_LIBS) -o $@ $(LNK_FLAGS) testepsg$(EXE): testepsg.$(OBJ_EXT) $(DEP_LIBS) - $(LD) $(LNK_FLAGS) $< $(XTRAOBJ) $(CONFIG_LIBS) -o $@ + $(LD) $< $(XTRAOBJ) $(CONFIG_LIBS) -o $@ $(LNK_FLAGS) ogrtindex$(EXE): ogrtindex.$(OBJ_EXT) $(DEP_LIBS) - $(LD) $(LNK_FLAGS) $< $(XTRAOBJ) $(CONFIG_LIBS) -o $@ + $(LD) $< $(XTRAOBJ) $(CONFIG_LIBS) -o $@ $(LNK_FLAGS) test_ogrsf$(EXE): test_ogrsf.$(OBJ_EXT) commonutils.$(OBJ_EXT) $(DEP_LIBS) - $(LD) $(LNK_FLAGS) $< commonutils.$(OBJ_EXT) $(XTRAOBJ) $(CONFIG_LIBS) -o $@ + $(LD) $< commonutils.$(OBJ_EXT) $(XTRAOBJ) $(CONFIG_LIBS) -o $@ $(LNK_FLAGS) gdalasyncread$(EXE): gdalasyncread.$(OBJ_EXT) $(DEP_LIBS) - $(LD) $(LNK_FLAGS) $< $(XTRAOBJ) $(CONFIG_LIBS) -o $@ + $(LD) $< $(XTRAOBJ) $(CONFIG_LIBS) -o $@ $(LNK_FLAGS) testreprojmulti$(EXE): testreprojmulti.$(OBJ_EXT) $(DEP_LIBS) - $(LD) $(LNK_FLAGS) $< $(XTRAOBJ) $(CONFIG_LIBS) -o $@ + $(LD) $< $(XTRAOBJ) $(CONFIG_LIBS) -o $@ $(LNK_FLAGS) clean: $(RM) *.o $(BIN_LIST) core gdal-config gdal-config-inst
Change History (3)
comment:1 by , 8 years ago
comment:2 by , 8 years ago
As per your first question and comment - I'm not sure either. Let me know if you'd like me to test.
Did you try your change with non-libtool ( ./configure --without-libool ) builds ?
I've not tested this change with '--without-libool'. I tried to use '--without-libool' but hit the problem that '--enable-static' was then ignored and a libgdal.a was not produced. Only a libgdal.so
. That was a dealbreaker for me. So I've since been trying to work around all the challenges with getting static linking working with libtool. There are a number of over things I needed to do to get libtool builds linking okay. The above patch is the only one I could not find a workaround for. The others I could work around. See the comments at https://github.com/mapbox/mason/blob/8e14adcd9a0571e12f86f2ed54c3a3a1347c6101/scripts/gdal/2.0.2/script.sh#L64-L87.
Overall: I'm able to carry this patch if you are uncomfortable applying. If that is the case, please close this issue.
comment:3 by , 5 years ago
Milestone: | → closed_because_of_github_migration |
---|---|
Resolution: | → wontfix |
Status: | new → closed |
This ticket has been automatically closed because Trac is no longer used for GDAL bug tracking, since the project has migrated to GitHub. If you believe this ticket is still valid, you may file it to https://github.com/OSGeo/gdal/issues if it is not already reported there.
I terribly suck at makefiles, so I'm not sure to understand all the implications of this change. What if LDFLAGS contained a linker flag (-fPIC etc...) : would that be safe to be put at the end of the command line ?
I've noticed that in the log of your error message, it seems that there was re-ordering of arguments with respect to the initial order given by $(LD) $(LNK_FLAGS) $< $(XTRAOBJ) $(CONFIG_LIBS) -o $@, since "gdallocationinfo.o -o gdallocationinfo" comes in first. I guess this is libtool black magic...
Did you try your change with non-libtool ( ./configure --without-libool ) builds ?