Opened 5 years ago
Closed 5 years ago
#4408 closed defect (fixed)
can't compile --with-wagyu under mingw64
Reported by: | robe | Owned by: | Algunenano |
---|---|---|---|
Priority: | blocker | Milestone: | PostGIS 3.0.0 |
Component: | postgis | Version: | master |
Keywords: | Cc: |
Description
../deps/wagyu/libwagyu.la(lwgeom_wagyu.o):lwgeom_wagyu.cpp:(.rdata$_ZTISt13runtime_error[_ZTISt13runtime_error]+0x0): undefined reference to `vtable for __cxxabiv1::__si_class_type_info' ../deps/wagyu/libwagyu.la(lwgeom_wagyu.o):lwgeom_wagyu.cpp:(.rdata$_ZTISt9exception[_ZTISt9exception]+0x0): undefined reference to `vtable for __cxxabiv1::__class_type_info' ../deps/wagyu/libwagyu.la(lwgeom_wagyu.o):lwgeom_wagyu.cpp:(.rdata$.refptr._ZSt7nothrow[.refptr._ZSt7nothrow]+0x0): undefined reference to `std::nothrow' collect2.exe: error: ld returned 1 exit status make[1]: *** [C:/MING64~1/projects/POSTGR~1/rel/PG12W6~2/lib/pgxs/src/MAKEFI~1/../../src/Makefile.shlib:386: postgis-3.dll] Error 1
This is using gcc 8.1
gcc.exe (x86_64-posix-seh-rev0, Built by MinGW-W64 project) 8.1.0
Change History (13)
comment:1 by , 5 years ago
Owner: | changed from | to
---|---|
Version: | 2.4.x → trunk |
comment:2 by , 5 years ago
here is the error including the command prior
gcc -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Werror=vla -Wendif-labels -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -Wno-format-truncation -Wno-stringop-truncation -g -O2 -shared -static-libgcc -o postgis-3.dll postgis_module.o lwgeom_accum.o lwgeom_spheroid.o lwgeom_ogc.o lwgeom_functions_analytic.o lwgeom_inout.o lwgeom_functions_basic.o lwgeom_btree.o lwgeom_box.o lwgeom_box3d.o lwgeom_geos.o lwgeom_sfcgal.o lwgeom_geos_prepared.o lwgeom_geos_clean.o lwgeom_geos_relatematch.o lwgeom_export.o lwgeom_in_gml.o lwgeom_in_kml.o lwgeom_in_geohash.o lwgeom_in_geojson.o lwgeom_in_encoded_polyline.o lwgeom_triggers.o lwgeom_dump.o lwgeom_dumppoints.o lwgeom_functions_lrs.o lwgeom_functions_temporal.o lwgeom_rectree.o long_xact.o lwgeom_sqlmm.o lwgeom_rtree.o lwgeom_transform.o lwgeom_window.o gserialized_typmod.o gserialized_gist_2d.o gserialized_gist_nd.o gserialized_supportfn.o gserialized_spgist_2d.o gserialized_spgist_3d.o gserialized_spgist_nd.o brin_2d.o brin_nd.o brin_common.o gserialized_estimate.o geography_inout.o geography_btree.o geography_centroid.o geography_measurement.o geography_measurement_trees.o geometry_inout.o postgis_libprotobuf.o vector_tile.pb-c.o geobuf.pb-c.o mvt.o lwgeom_out_mvt.o geobuf.o lwgeom_out_geobuf.o lwgeom_out_geojson.o postgis_legacy.o -LC:/MING64~1/projects/POSTGR~1/rel/PG12W6~2/lib -L/projects/zlib/rel-zlib-1.2.11w64gcc81/lib -L/projects/libxml/rel-libxml2-2.7.8w64gcc81/lib -Wl,--allow-multiple-definition -Wl,--disable-auto-import -L/projects/libxml/rel-libxml2-2.7.8w64gcc81/lib -Wl,--as-needed ../deps/wagyu/libwagyu.la -lstdc++ ../libpgcommon/libpgcommon.a ../liblwgeom/.libs/liblwgeom.a -LC:/ming64gcc81/projects/geos/rel-3.8w64gcc81/lib -lgeos_c -L/projects/proj/rel-6.0.0w64gcc81/lib -lproj -L/projects/protobuf/rel-3.2.0w64gcc81/lib -lprotobuf-c -L/projects/libxml/rel-libxml2-2.7.8w64gcc81/lib -lxml2 -lws2_32 -L/projects/CGAL/rel-sfcgal-1.3.2w64gcc81/lib -lSFCGAL -Wl,--exclude-libs,ALL -L/projects/CGAL/rel-sfcgal-1.3.2w64gcc81/lib -lSFCGAL -LC:/MING64~1/projects/POSTGR~1/rel/PG12W6~2/lib -lpostgres -lpgcommon -lpgport -lxml2 -lz -lws2_32 -lm -lws2_32 -Wl,--export-all-symbols -Wl,--out-implib=libpostgis-3.a ../deps/wagyu/libwagyu.la(lwgeom_wagyu.o):lwgeom_wagyu.cpp:(.rdata$_ZTISt13runtime_error[_ZTISt13runtime_error]+0x0): undefined reference to `vtable for __cxxabiv1::__si_class_type_info' ../deps/wagyu/libwagyu.la(lwgeom_wagyu.o):lwgeom_wagyu.cpp:(.rdata$_ZTISt9exception[_ZTISt9exception]+0x0): undefined reference to `vtable for __cxxabiv1::__class_type_info' ../deps/wagyu/libwagyu.la(lwgeom_wagyu.o):lwgeom_wagyu.cpp:(.rdata$.refptr._ZSt7nothrow[.refptr._ZSt7nothrow]+0x0): undefined reference to `std::nothrow' collect2.exe: error: ld returned 1 exit status make[1]: *** [C:/MING64~1/projects/POSTGR~1/rel/PG12W6~2/lib/pgxs/src/MAKEFI~1/../../src/Makefile.shlib:386: postgis-3.dll] Error 1 make[1]: Leaving directory '/projects/postgis/branches/3.0/postgis' make: *** [GNUmakefile:20: all] Error 1
in config.log - no warning just a
configure:18519: result: none required configure:18595: result: WAGYU: Wagyu usage requested configure:18726: checking for C++ compiler version configure:18735: gcc --version >&5 gcc.exe (x86_64-posix-seh-rev0, Built by MinGW-W64 project) 8.1.0
and configure out shows this
-------------- Compiler Info ------------- C compiler: x86_64-w64-mingw32-gcc -std=gnu99 -g -O2 -fno-math-errno -fno-signed-zeros C++ compiler (Wagyu): gcc -std=c++11 -x c++ CPPFLAGS: -IC:/ming64gcc81/projects/geos/rel-3.8w64gcc81/include -I/projects/proj/rel-6.0.0w64gcc81/include -I/projects/protobuf/rel-3.2.0w64gcc81/include -I/projects/libxml/rel-libxml2-2.7.8w64gcc81/include/libxml2 -I/projects/CGAL/rel-sfcgal-1.3.2w64gcc81/include -I/projects/json-c/rel-0.12w64gcc81/include/json-c SQL preprocessor: /mingw/bin/cpp -traditional-cpp -w -P -------------- Additional Info ------------- Interrupt Tests: DISABLED use: --with-interrupt-tests to enable -------------- Dependencies -------------- GEOS config: /projects/geos/rel-3.8w64gcc81/bin/geos-config GEOS version: 3.8.0 GDAL config: /projects/gdal/rel-2.3.1w64gcc81/bin/gdal-config GDAL version: 2.3.1 SFCGAL config: /projects/CGAL/rel-sfcgal-1.3.2w64gcc81/bin/sfcgal-config SFCGAL version: 1.3.2 PostgreSQL config: /projects/postgresql/rel/pg12w64gcc81/bin/pg_config PostgreSQL version: PostgreSQL 12beta1 PROJ4 version: 60 Libxml2 config: /projects/libxml/rel-libxml2-2.7.8w64gcc81/bin/xml2-config Libxml2 version: 2.7.8 JSON-C support: no protobuf-c support: yes PCRE support: no Perl: /bin/perl Wagyu: yes --------------- Extensions --------------- PostGIS Raster: enabled
I'm going to go ahead and turn on winnie's wagyu -- she's still building with an older compiler but sometimes that one for whatever reason doesn't run into the same issues my newer one does.
comment:4 by , 5 years ago
Sadly winnie has same issue
https://winnie.postgis.net:444/job/PostGIS_EDB_Regress_winnie/9078/consoleFull
../deps/wagyu/libwagyu.la(lwgeom_wagyu.o):lwgeom_wagyu.cpp:(.text$_ZSt20get_temporary_bufferIPN6mapbox8geometry5wagyu13local_minimumIiEEESt4pairIPT_xEx[_ZSt20get_temporary_bufferIPN6mapbox8geometry5wagyu13local_minimumIiEEESt4pairIPT_xEx]+0x4c): undefined reference to `std::nothrow' ../deps/wagyu/libwagyu.la(lwgeom_wagyu.o):lwgeom_wagyu.cpp:(.text$_ZSt23return_temporary_bufferIPN6mapbox8geometry5wagyu13local_minimumIiEEEvPT_[_ZSt23return_temporary_bufferIPN6mapbox8geometry5wagyu13local_minimumIiEEEvPT_]+0xf): undefined reference to `std::nothrow' C:/ming64gcc48/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/4.8.3/../../../../x86_64-w64-mingw32/bin/ld.exe: ../deps/wagyu/libwagyu.la(lwgeom_wagyu.o): bad reloc address 0xf in section `.text$_ZSt23return_temporary_bufferIPN6mapbox8geometry5wagyu13local_minimumIiEEEvPT_[_ZSt23return_temporary_bufferIPN6mapbox8geometry5wagyu13local_minimumIiEEEvPT_]' collect2.exe: error: ld returned 1 exit status E:/jenkins/postgresql/rel/pg11w64gcc48/lib/pgxs/src/makefiles/../../src/Makefile.shlib:381: recipe for target 'postgis-3.dll' failed make[1]: *** [postgis-3.dll] Error 1 make[1]: Leaving directory '/projects/postgis/branches/3.0/postgis' GNUmakefile:20: recipe for target 'all' failed make: *** [all] Error 1
comment:5 by , 5 years ago
The c++ std library seems to be detected correctly (-lstdc++) but Winnie seems to be using Gcc 4.8.3 to build the extension (using whatever was used to build postgres), not 8.1.
Is that right?
comment:6 by , 5 years ago
Sorry I should have explained.
Locally I am running mingw64 gcc 8.1.0 and everything I have is compiled against 8.1.0 including PostgreSQL.
Winnie is running gcc 4.8.3 and everything she has is compiled against gcc 4.8.3 (4.8.1 for her 32-bit runs).
gcc 4.8.3 should be c++ 11 compliant as well.
Anyway we both seem to have the same issue.
Here is her output:
-------------- Compiler Info ------------- C compiler: x86_64-w64-mingw32-gcc -std=gnu99 -g -O2 -fno-math-errno -fno-signed-zeros C++ compiler (Wagyu): gcc -std=c++11 -x c++ CPPFLAGS: -IE:/jenkins/geos/rel-3.8w64gcc48/include -I/projects/proj/rel-4.9.3w64gcc48/include -I/projects/protobuf/rel-3.2.0w64gcc48/include -I/projects/libxml/rel-libxml2-2.7.8w64gcc48/include/libxml2 -I/projects/CGAL/rel-sfcgal-1.3.2w64gcc48/include -I/projects/json-c/rel-0.12w64gcc48/include/json-c -I/projects/pcre/rel-8.33w64gcc48/include SQL preprocessor: /mingw/bin/cpp -traditional-cpp -w -P -------------- Additional Info ------------- Interrupt Tests: DISABLED use: --with-interrupt-tests to enable -------------- Dependencies -------------- GEOS config: /projects/geos/rel-3.8w64gcc48/bin/geos-config GEOS version: 3.8.0 GDAL config: /projects/gdal/rel-2.2.4w64gcc48/bin/gdal-config GDAL version: 2.2.4 SFCGAL config: /projects/CGAL/rel-sfcgal-1.3.2w64gcc48/bin/sfcgal-config SFCGAL version: 1.3.2 PostgreSQL config: /projects/postgresql/rel/pg11w64gcc48/bin/pg_config PostgreSQL version: PostgreSQL 11.0 PROJ4 version: 49 Libxml2 config: /projects/libxml/rel-libxml2-2.7.8w64gcc48/bin/xml2-config Libxml2 version: 2.7.8 JSON-C support: no protobuf-c support: yes PCRE support: yes Perl: /bin/perl Wagyu: yes --------------- Extensions --------------- PostGIS Raster: enabled PostGIS Topology: enabled SFCGAL support: enabled Address Standardizer support: enabled -------- Documentation Generation -------- xsltproc: /projects/xsltproc/xsltproc xsl style sheets: /projects/docbook/docbook-xsl-1.76.1 dblatex: convert: /c/Windows/system32/convert mathml2.dtd: http://www.w3.org/Math/DTD/mathml2/mathml2.dtd
comment:7 by , 5 years ago
I wonder if it has to do with the mix of C in std=gnu99 mode and the C++ being in std=c++11
comment:8 by , 5 years ago
I think that the issue comes from the linker being gcc and not g++.
In my Linux machine this wasn't an issue (modern GCC/Clang), for OSX I added a small detection utility so now it adds -lstdc++
or -lc++
, but it looks like this isn't enough it the mingw setup.
Can you try running the last command changing gcc for g++:
g++ -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Werror=vla -Wendif-labels -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -Wno-format-truncation -Wno-stringop-truncation -g -O2 -shared -static-libgcc -o postgis-3.dll postgis_module.o lwgeom_accum.o lwgeom_spheroid.o lwgeom_ogc.o lwgeom_functions_analytic.o lwgeom_inout.o lwgeom_functions_basic.o lwgeom_btree.o lwgeom_box.o lwgeom_box3d.o lwgeom_geos.o lwgeom_sfcgal.o lwgeom_geos_prepared.o lwgeom_geos_clean.o lwgeom_geos_relatematch.o lwgeom_export.o lwgeom_in_gml.o lwgeom_in_kml.o lwgeom_in_geohash.o lwgeom_in_geojson.o lwgeom_in_encoded_polyline.o lwgeom_triggers.o lwgeom_dump.o lwgeom_dumppoints.o lwgeom_functions_lrs.o lwgeom_functions_temporal.o lwgeom_rectree.o long_xact.o lwgeom_sqlmm.o lwgeom_rtree.o lwgeom_transform.o lwgeom_window.o gserialized_typmod.o gserialized_gist_2d.o gserialized_gist_nd.o gserialized_supportfn.o gserialized_spgist_2d.o gserialized_spgist_3d.o gserialized_spgist_nd.o brin_2d.o brin_nd.o brin_common.o gserialized_estimate.o geography_inout.o geography_btree.o geography_centroid.o geography_measurement.o geography_measurement_trees.o geometry_inout.o postgis_libprotobuf.o vector_tile.pb-c.o geobuf.pb-c.o mvt.o lwgeom_out_mvt.o geobuf.o lwgeom_out_geobuf.o lwgeom_out_geojson.o postgis_legacy.o -LC:/MING64~1/projects/POSTGR~1/rel/PG12W6~2/lib -L/projects/zlib/rel-zlib-1.2.11w64gcc81/lib -L/projects/libxml/rel-libxml2-2.7.8w64gcc81/lib -Wl,--allow-multiple-definition -Wl,--disable-auto-import -L/projects/libxml/rel-libxml2-2.7.8w64gcc81/lib -Wl,--as-needed ../deps/wagyu/libwagyu.la -lstdc++ ../libpgcommon/libpgcommon.a ../liblwgeom/.libs/liblwgeom.a -LC:/ming64gcc81/projects/geos/rel-3.8w64gcc81/lib -lgeos_c -L/projects/proj/rel-6.0.0w64gcc81/lib -lproj -L/projects/protobuf/rel-3.2.0w64gcc81/lib -lprotobuf-c -L/projects/libxml/rel-libxml2-2.7.8w64gcc81/lib -lxml2 -lws2_32 -L/projects/CGAL/rel-sfcgal-1.3.2w64gcc81/lib -lSFCGAL -Wl,--exclude-libs,ALL -L/projects/CGAL/rel-sfcgal-1.3.2w64gcc81/lib -lSFCGAL -LC:/MING64~1/projects/POSTGR~1/rel/PG12W6~2/lib -lpostgres -lpgcommon -lpgport -lxml2 -lz -lws2_32 -lm -lws2_32 -Wl,--export-all-symbols -Wl,--out-implib=libpostgis-3.a
If that works I can confirm that the aim is correct and I'll investigate further to see what extra flags we'd need to add to link the C++ code correctly.
comment:9 by , 5 years ago
Changing gcc to g++ didn't help.
However I was able to get it to compile by removing the
-Wl,--disable-auto-import
So my final working is below using g++ vs. gcc doesn't seem to make any difference
gcc -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Werror=vla -Wendif-labels -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -Wno-format-truncation -Wno-stringop-truncation -g -O2 -shared -static-libgcc -o postgis-3.dll postgis_module.o lwgeom_accum.o lwgeom_spheroid.o lwgeom_ogc.o lwgeom_functions_analytic.o lwgeom_inout.o lwgeom_functions_basic.o lwgeom_btree.o lwgeom_box.o lwgeom_box3d.o lwgeom_geos.o lwgeom_sfcgal.o lwgeom_geos_prepared.o lwgeom_geos_clean.o lwgeom_geos_relatematch.o lwgeom_export.o lwgeom_in_gml.o lwgeom_in_kml.o lwgeom_in_geohash.o lwgeom_in_geojson.o lwgeom_in_encoded_polyline.o lwgeom_triggers.o lwgeom_dump.o lwgeom_dumppoints.o lwgeom_functions_lrs.o lwgeom_functions_temporal.o lwgeom_rectree.o long_xact.o lwgeom_sqlmm.o lwgeom_rtree.o lwgeom_transform.o lwgeom_window.o gserialized_typmod.o gserialized_gist_2d.o gserialized_gist_nd.o gserialized_supportfn.o gserialized_spgist_2d.o gserialized_spgist_3d.o gserialized_spgist_nd.o brin_2d.o brin_nd.o brin_common.o gserialized_estimate.o geography_inout.o geography_btree.o geography_centroid.o geography_measurement.o geography_measurement_trees.o geometry_inout.o postgis_libprotobuf.o vector_tile.pb-c.o geobuf.pb-c.o mvt.o lwgeom_out_mvt.o geobuf.o lwgeom_out_geobuf.o lwgeom_out_geojson.o postgis_legacy.o -LC:/MING64~1/projects/POSTGR~1/rel/PG12W6~2/lib -L/projects/zlib/rel-zlib-1.2.11w64gcc81/lib -L/projects/libxml/rel-libxml2-2.7.8w64gcc81/lib -Wl,--allow-multiple-definition -L/projects/libxml/rel-libxml2-2.7.8w64gcc81/lib -Wl,--as-needed ../deps/wagyu/libwagyu.la -lstdc++ ../libpgcommon/libpgcommon.a ../liblwgeom/.libs/liblwgeom.a -LC:/ming64gcc81/projects/geos/rel-3.8w64gcc81/lib -lgeos_c -LC:/ming64gcc81/projects/proj/rel-6.0.0w64gcc81/lib -lproj -LC:/ming64gcc81/projects/json-c/rel-0.12w64gcc81/lib -ljson-c -LC:/ming64gcc81/projects/protobuf/rel-3.2.0w64gcc81/lib -lprotobuf-c -L/projects/libxml/rel-libxml2-2.7.8w64gcc81/lib -lxml2 -lws2_32 -L/projects/CGAL/rel-sfcgal-1.3.2w64gcc81/lib -lSFCGAL -Wl,--exclude-libs,ALL -L/projects/CGAL/rel-sfcgal-1.3.2w64gcc81/lib -lSFCGAL -LC:/MING64~1/projects/POSTGR~1/rel/PG12W6~2/lib -lpostgres -lpgcommon -lpgport -lxml2 -lz -lws2_32 -lm -lws2_32 -Wl,--export-all-symbols -Wl,--out-implib=libpostgis-3.a
comment:10 by , 5 years ago
I vaguely remember having this issue before and I think it had to do with the order of libs in SHLIB. I see you have WAYGU lib in front. I'm experimenting to moving it to the end to see if that fixes the issue.
comment:11 by , 5 years ago
sadly changing order of things doesn't make a difference, so I think I just got to get rid of the -Wl,--disable-auto-import
I was hunting to see where this is set, but I don't have it set.
I suspect it may be brought in via PostgreSQL, as they have this for win32 and maybe it's being pulled in by PGXS
In the past I've fiddled with that because it caused compilation problems, but then after 9.4 it seemed to not be an issue.
This is what PostgreSQL 12 win32 template has:
# src/template/win32 # --allow-multiple-definition is required to link pg_dump because it finds # pg_toupper() etc. in both libpq and pgport # --disable-auto-import is to ensure we get MSVC-like linking behavior LDFLAGS="$LDFLAGS -Wl,--allow-multiple-definition -Wl,--disable-auto-import"
anyway trying to override it in postgis by setting the LDFLAGS with --enable-auto-import doesn't seem to work. So I'll just disable it for now on winnie until we have this sorted out.
I also noticed that --with-wagyu turned on (when I manually compile) my postgis-3.so now has a direct dependency to libstdc++ where as I don't think it did before. I'm not sure if that is going to be an issue or not.
comment:12 by , 5 years ago
actually I think I may have had a typo and was able to overwrite the setting. Going thru my steps now and will check to make sure all pass before I make the change to winnie.
Thanks for testing it.
I guess that it is failing when linking postgis-3.so, but I'm not certain. Can you share the final command that led to this error, please?
Also, can you include the output of
./configure --with-wagyu
?. Does it warn with something likeCould not find a C++ standard library
? I'm using a very basic detection system (which was needed for OSX) which might require an extra option for mingw.