Build fails with LTO due to ODR violations
I tried to build with the following *FLAGS to optimize the build: -flto=4 -Werror=odr -Werror=lto-type-mismatch -Werror=strict-aliasing
Note the -Werror=* flags are used to help detect cases where the compiler tries to optimize by assuming UB cannot exist in the source code -- if it does exist, ordinarily the code would be miscompiled, and this says to make the miscompilation a fatal error.
I got this error:
[80/242] : && /usr/bin/x86_64-pc-linux-gnu-g++ -pipe -march=native -fstack-protector-all -O2 -fdiagnostics-color=always -frecord-gcc-switches -flto=4 -Werror=odr -Werror=lto-type-mismatch -Werror=strict-aliasing -Wformat -Werror=format-security -Wl,-O1 -Wl,--as-needed -Wl,-z,pack-relative-relocs -flto=4 -Werror=odr -Werror=lto-type-mismatch -Werror=strict-aliasing -Wl,--defsym=__gentoo_check_ldflags__=0 gle/CMakeFiles/gle_common.dir/bitmap/img2ps.cpp.o gle/CMakeFiles/gle_common.dir/bitmap/lzwencode.cpp.o gle/CMakeFiles/gle_common.dir/bitmap/glegif.cpp.o gle/CMakeFiles/gle_common.dir/bitmap/glejpeg.cpp.o gle/CMakeFiles/gle_common.dir/bitmap/gletiff.cpp.o gle/CMakeFiles/gle_common.dir/bitmap/glepng.cpp.o gle/CMakeFiles/gle_common.dir/bitmap/ascii85.cpp.o gle/CMakeFiles/gle_common.dir/letzfitz/let.cpp.o gle/CMakeFiles/gle_common.dir/letzfitz/fit.cpp.o gle/CMakeFiles/gle_common.dir/letzfitz/ffit.cpp.o gle/CMakeFiles/gle_common.dir/surface/gsurface.cpp.o gle/CMakeFiles/gle_common.dir/surface/hide.cpp.o gle/CMakeFiles/gle_common.dir/surface/fcontour.cpp.o gle/CMakeFiles/gle_common.dir/surface/ffitcontour.cpp.o gle/CMakeFiles/gle_common.dir/surface/gcontour.cpp.o gle/CMakeFiles/gle_common.dir/tokens/Tokenizer.cpp.o gle/CMakeFiles/gle_common.dir/tokens/StringKeyHash.cpp.o gle/CMakeFiles/gle_common.dir/tokens/BinIO.cpp.o gle/CMakeFiles/gle_common.dir/axis.cpp.o gle/CMakeFiles/gle_common.dir/b_tab.cpp.o gle/CMakeFiles/gle_common.dir/b_text.cpp.o gle/CMakeFiles/gle_common.dir/begin.cpp.o gle/CMakeFiles/gle_common.dir/core.cpp.o gle/CMakeFiles/gle_common.dir/curve.cpp.o gle/CMakeFiles/gle_common.dir/color.cpp.o gle/CMakeFiles/gle_common.dir/drawit.cpp.o gle/CMakeFiles/gle_common.dir/eval.cpp.o gle/CMakeFiles/gle_common.dir/fitbez.cpp.o gle/CMakeFiles/gle_common.dir/fitcf.cpp.o gle/CMakeFiles/gle_common.dir/fn.cpp.o gle/CMakeFiles/gle_common.dir/font.cpp.o gle/CMakeFiles/gle_common.dir/general.cpp.o gle/CMakeFiles/gle_common.dir/op_def.cpp.o gle/CMakeFiles/gle_common.dir/gprint.cpp.o gle/CMakeFiles/gle_common.dir/graph.cpp.o gle/CMakeFiles/gle_common.dir/graph2.cpp.o gle/CMakeFiles/gle_common.dir/key.cpp.o gle/CMakeFiles/gle_common.dir/keyword.cpp.o gle/CMakeFiles/gle_common.dir/leastsq.cpp.o gle/CMakeFiles/gle_common.dir/memory.cpp.o gle/CMakeFiles/gle_common.dir/mychar.cpp.o gle/CMakeFiles/gle_common.dir/pass.cpp.o gle/CMakeFiles/gle_common.dir/polish.cpp.o gle/CMakeFiles/gle_common.dir/run.cpp.o gle/CMakeFiles/gle_common.dir/savgol.cpp.o gle/CMakeFiles/gle_common.dir/sub.cpp.o gle/CMakeFiles/gle_common.dir/tex.cpp.o gle/CMakeFiles/gle_common.dir/token.cpp.o gle/CMakeFiles/gle_common.dir/var.cpp.o gle/CMakeFiles/gle_common.dir/cutils.cpp.o gle/CMakeFiles/gle_common.dir/texinterface.cpp.o gle/CMakeFiles/gle_common.dir/d_ps.cpp.o gle/CMakeFiles/gle_common.dir/d_svg.cpp.o gle/CMakeFiles/gle_common.dir/d_x.cpp.o gle/CMakeFiles/gle_common.dir/d_dummy.cpp.o gle/CMakeFiles/gle_common.dir/d_cairo.cpp.o gle/CMakeFiles/gle_common.dir/config.cpp.o gle/CMakeFiles/gle_common.dir/numberformat.cpp.o gle/CMakeFiles/gle_common.dir/glearray.cpp.o gle/CMakeFiles/gle_common.dir/cmdline.cpp.o gle/CMakeFiles/gle_common.dir/gle-block.cpp.o gle/CMakeFiles/gle_common.dir/gle-sourcefile.cpp.o gle/CMakeFiles/gle_common.dir/gle-interface.cpp.o gle/CMakeFiles/gle_common.dir/gle-base.cpp.o gle/CMakeFiles/gle_common.dir/gle-datatype.cpp.o gle/CMakeFiles/gle_common.dir/gle-poppler.cpp.o gle/CMakeFiles/gle_common.dir/builtin-double.cpp.o gle/CMakeFiles/gle_common.dir/file_io.cpp.o gle/CMakeFiles/gle_common.dir/specialfunctions.cpp.o gle/CMakeFiles/gle.dir/gle.cpp.o -o gle/gle /usr/lib64/libtiff.so /usr/lib64/libz.so /usr/lib64/libjpeg.so /usr/lib64/libpng.so /usr/lib64/libz.so /usr/lib64/libcairo.so /usr/lib64/libpixman-1.so /usr/lib64/liblzma.so /usr/lib64/libjpeg.so /usr/lib64/libpng.so /usr/lib64/libcairo.so /usr/lib64/libpixman-1.so /usr/lib64/liblzma.so && :
FAILED: gle/gle
: && /usr/bin/x86_64-pc-linux-gnu-g++ -pipe -march=native -fstack-protector-all -O2 -fdiagnostics-color=always -frecord-gcc-switches -flto=4 -Werror=odr -Werror=lto-type-mismatch -Werror=strict-aliasing -Wformat -Werror=format-security -Wl,-O1 -Wl,--as-needed -Wl,-z,pack-relative-relocs -flto=4 -Werror=odr -Werror=lto-type-mismatch -Werror=strict-aliasing -Wl,--defsym=__gentoo_check_ldflags__=0 gle/CMakeFiles/gle_common.dir/bitmap/img2ps.cpp.o gle/CMakeFiles/gle_common.dir/bitmap/lzwencode.cpp.o gle/CMakeFiles/gle_common.dir/bitmap/glegif.cpp.o gle/CMakeFiles/gle_common.dir/bitmap/glejpeg.cpp.o gle/CMakeFiles/gle_common.dir/bitmap/gletiff.cpp.o gle/CMakeFiles/gle_common.dir/bitmap/glepng.cpp.o gle/CMakeFiles/gle_common.dir/bitmap/ascii85.cpp.o gle/CMakeFiles/gle_common.dir/letzfitz/let.cpp.o gle/CMakeFiles/gle_common.dir/letzfitz/fit.cpp.o gle/CMakeFiles/gle_common.dir/letzfitz/ffit.cpp.o gle/CMakeFiles/gle_common.dir/surface/gsurface.cpp.o gle/CMakeFiles/gle_common.dir/surface/hide.cpp.o gle/CMakeFiles/gle_common.dir/surface/fcontour.cpp.o gle/CMakeFiles/gle_common.dir/surface/ffitcontour.cpp.o gle/CMakeFiles/gle_common.dir/surface/gcontour.cpp.o gle/CMakeFiles/gle_common.dir/tokens/Tokenizer.cpp.o gle/CMakeFiles/gle_common.dir/tokens/StringKeyHash.cpp.o gle/CMakeFiles/gle_common.dir/tokens/BinIO.cpp.o gle/CMakeFiles/gle_common.dir/axis.cpp.o gle/CMakeFiles/gle_common.dir/b_tab.cpp.o gle/CMakeFiles/gle_common.dir/b_text.cpp.o gle/CMakeFiles/gle_common.dir/begin.cpp.o gle/CMakeFiles/gle_common.dir/core.cpp.o gle/CMakeFiles/gle_common.dir/curve.cpp.o gle/CMakeFiles/gle_common.dir/color.cpp.o gle/CMakeFiles/gle_common.dir/drawit.cpp.o gle/CMakeFiles/gle_common.dir/eval.cpp.o gle/CMakeFiles/gle_common.dir/fitbez.cpp.o gle/CMakeFiles/gle_common.dir/fitcf.cpp.o gle/CMakeFiles/gle_common.dir/fn.cpp.o gle/CMakeFiles/gle_common.dir/font.cpp.o gle/CMakeFiles/gle_common.dir/general.cpp.o gle/CMakeFiles/gle_common.dir/op_def.cpp.o gle/CMakeFiles/gle_common.dir/gprint.cpp.o gle/CMakeFiles/gle_common.dir/graph.cpp.o gle/CMakeFiles/gle_common.dir/graph2.cpp.o gle/CMakeFiles/gle_common.dir/key.cpp.o gle/CMakeFiles/gle_common.dir/keyword.cpp.o gle/CMakeFiles/gle_common.dir/leastsq.cpp.o gle/CMakeFiles/gle_common.dir/memory.cpp.o gle/CMakeFiles/gle_common.dir/mychar.cpp.o gle/CMakeFiles/gle_common.dir/pass.cpp.o gle/CMakeFiles/gle_common.dir/polish.cpp.o gle/CMakeFiles/gle_common.dir/run.cpp.o gle/CMakeFiles/gle_common.dir/savgol.cpp.o gle/CMakeFiles/gle_common.dir/sub.cpp.o gle/CMakeFiles/gle_common.dir/tex.cpp.o gle/CMakeFiles/gle_common.dir/token.cpp.o gle/CMakeFiles/gle_common.dir/var.cpp.o gle/CMakeFiles/gle_common.dir/cutils.cpp.o gle/CMakeFiles/gle_common.dir/texinterface.cpp.o gle/CMakeFiles/gle_common.dir/d_ps.cpp.o gle/CMakeFiles/gle_common.dir/d_svg.cpp.o gle/CMakeFiles/gle_common.dir/d_x.cpp.o gle/CMakeFiles/gle_common.dir/d_dummy.cpp.o gle/CMakeFiles/gle_common.dir/d_cairo.cpp.o gle/CMakeFiles/gle_common.dir/config.cpp.o gle/CMakeFiles/gle_common.dir/numberformat.cpp.o gle/CMakeFiles/gle_common.dir/glearray.cpp.o gle/CMakeFiles/gle_common.dir/cmdline.cpp.o gle/CMakeFiles/gle_common.dir/gle-block.cpp.o gle/CMakeFiles/gle_common.dir/gle-sourcefile.cpp.o gle/CMakeFiles/gle_common.dir/gle-interface.cpp.o gle/CMakeFiles/gle_common.dir/gle-base.cpp.o gle/CMakeFiles/gle_common.dir/gle-datatype.cpp.o gle/CMakeFiles/gle_common.dir/gle-poppler.cpp.o gle/CMakeFiles/gle_common.dir/builtin-double.cpp.o gle/CMakeFiles/gle_common.dir/file_io.cpp.o gle/CMakeFiles/gle_common.dir/specialfunctions.cpp.o gle/CMakeFiles/gle.dir/gle.cpp.o -o gle/gle /usr/lib64/libtiff.so /usr/lib64/libz.so /usr/lib64/libjpeg.so /usr/lib64/libpng.so /usr/lib64/libz.so /usr/lib64/libcairo.so /usr/lib64/libpixman-1.so /usr/lib64/liblzma.so /usr/lib64/libjpeg.so /usr/lib64/libpng.so /usr/lib64/libcairo.so /usr/lib64/libpixman-1.so /usr/lib64/liblzma.so && :
/var/tmp/portage/sci-visualization/gle-9999/work/gle-9999/src/gle/eval.cpp:97:8: error: type ‘struct keyw’ violates the C++ One Definition Rule [-Werror=odr]
97 | struct keyw
| ^
/var/tmp/portage/sci-visualization/gle-9999/work/gle-9999/src/gle/fn.cpp:58:8: note: a different type is defined in another translation unit
58 | struct keyw { const char *word; int index; int ret,np,p[5]; } keywfn[] = {
| ^
/var/tmp/portage/sci-visualization/gle-9999/work/gle-9999/src/gle/eval.cpp:99:15: note: the first difference of corresponding definitions is field ‘word’
99 | char *word;
| ^
/var/tmp/portage/sci-visualization/gle-9999/work/gle-9999/src/gle/fn.cpp:58:27: note: a field of same name but different type is defined in another translation unit
58 | struct keyw { const char *word; int index; int ret,np,p[5]; } keywfn[] = {
| ^
/var/tmp/portage/sci-visualization/gle-9999/work/gle-9999/src/gle/eval.cpp:97:8: note: type ‘char’ should match type ‘const char’
97 | struct keyw
| ^
/var/tmp/portage/sci-visualization/gle-9999/work/gle-9999/src/gle/core.cpp:1868:8: error: type ‘struct mark_struct’ violates the C++ One Definition Rule [-Werror=odr]
1868 | struct mark_struct { int ff; int cc; double rx; double ry; double scl; double x1; double x2; double y1; double y2; };
| ^
/var/tmp/portage/sci-visualization/gle-9999/work/gle-9999/src/gle/pass.cpp:2367:8: note: a different type is defined in another translation unit
2367 | struct mark_struct { const char *name; const char *font; int cc; double rx; double ry; double scl; bool center;};
| ^
/var/tmp/portage/sci-visualization/gle-9999/work/gle-9999/src/gle/core.cpp:1868:26: note: the first difference of corresponding definitions is field ‘ff’
1868 | struct mark_struct { int ff; int cc; double rx; double ry; double scl; double x1; double x2; double y1; double y2; };
| ^
/var/tmp/portage/sci-visualization/gle-9999/work/gle-9999/src/gle/pass.cpp:2367:34: note: a field with different name is defined in another translation unit
2367 | struct mark_struct { const char *name; const char *font; int cc; double rx; double ry; double scl; bool center;};
| ^
lto1: some warnings being treated as errors
lto-wrapper: fatal error: /usr/bin/x86_64-pc-linux-gnu-g++ returned 1 exit status
compilation terminated.
/usr/libexec/gcc/x86_64-pc-linux-gnu/ld: error: lto-wrapper failed
collect2: error: ld returned 1 exit status
[81/242] : && /usr/bin/x86_64-pc-linux-gnu-g++ -fPIC -pipe -march=native -fstack-protector-all -O2 -fdiagnostics-color=always -frecord-gcc-switches -flto=4 -Werror=odr -Werror=lto-type-mismatch -Werror=strict-aliasing -Wformat -Werror=format-security -Wl,-O1 -Wl,--as-needed -Wl,-z,pack-relative-relocs -flto=4 -Werror=odr -Werror=lto-type-mismatch -Werror=strict-aliasing -Wl,--defsym=__gentoo_check_ldflags__=0 -fPIC -shared -Wl,-soname,liblibgle-graphics.so -o gle/liblibgle-graphics.so gle/CMakeFiles/gle_common.dir/bitmap/img2ps.cpp.o gle/CMakeFiles/gle_common.dir/bitmap/lzwencode.cpp.o gle/CMakeFiles/gle_common.dir/bitmap/glegif.cpp.o gle/CMakeFiles/gle_common.dir/bitmap/glejpeg.cpp.o gle/CMakeFiles/gle_common.dir/bitmap/gletiff.cpp.o gle/CMakeFiles/gle_common.dir/bitmap/glepng.cpp.o gle/CMakeFiles/gle_common.dir/bitmap/ascii85.cpp.o gle/CMakeFiles/gle_common.dir/letzfitz/let.cpp.o gle/CMakeFiles/gle_common.dir/letzfitz/fit.cpp.o gle/CMakeFiles/gle_common.dir/letzfitz/ffit.cpp.o gle/CMakeFiles/gle_common.dir/surface/gsurface.cpp.o gle/CMakeFiles/gle_common.dir/surface/hide.cpp.o gle/CMakeFiles/gle_common.dir/surface/fcontour.cpp.o gle/CMakeFiles/gle_common.dir/surface/ffitcontour.cpp.o gle/CMakeFiles/gle_common.dir/surface/gcontour.cpp.o gle/CMakeFiles/gle_common.dir/tokens/Tokenizer.cpp.o gle/CMakeFiles/gle_common.dir/tokens/StringKeyHash.cpp.o gle/CMakeFiles/gle_common.dir/tokens/BinIO.cpp.o gle/CMakeFiles/gle_common.dir/axis.cpp.o gle/CMakeFiles/gle_common.dir/b_tab.cpp.o gle/CMakeFiles/gle_common.dir/b_text.cpp.o gle/CMakeFiles/gle_common.dir/begin.cpp.o gle/CMakeFiles/gle_common.dir/core.cpp.o gle/CMakeFiles/gle_common.dir/curve.cpp.o gle/CMakeFiles/gle_common.dir/color.cpp.o gle/CMakeFiles/gle_common.dir/drawit.cpp.o gle/CMakeFiles/gle_common.dir/eval.cpp.o gle/CMakeFiles/gle_common.dir/fitbez.cpp.o gle/CMakeFiles/gle_common.dir/fitcf.cpp.o gle/CMakeFiles/gle_common.dir/fn.cpp.o gle/CMakeFiles/gle_common.dir/font.cpp.o gle/CMakeFiles/gle_common.dir/general.cpp.o gle/CMakeFiles/gle_common.dir/op_def.cpp.o gle/CMakeFiles/gle_common.dir/gprint.cpp.o gle/CMakeFiles/gle_common.dir/graph.cpp.o gle/CMakeFiles/gle_common.dir/graph2.cpp.o gle/CMakeFiles/gle_common.dir/key.cpp.o gle/CMakeFiles/gle_common.dir/keyword.cpp.o gle/CMakeFiles/gle_common.dir/leastsq.cpp.o gle/CMakeFiles/gle_common.dir/memory.cpp.o gle/CMakeFiles/gle_common.dir/mychar.cpp.o gle/CMakeFiles/gle_common.dir/pass.cpp.o gle/CMakeFiles/gle_common.dir/polish.cpp.o gle/CMakeFiles/gle_common.dir/run.cpp.o gle/CMakeFiles/gle_common.dir/savgol.cpp.o gle/CMakeFiles/gle_common.dir/sub.cpp.o gle/CMakeFiles/gle_common.dir/tex.cpp.o gle/CMakeFiles/gle_common.dir/token.cpp.o gle/CMakeFiles/gle_common.dir/var.cpp.o gle/CMakeFiles/gle_common.dir/cutils.cpp.o gle/CMakeFiles/gle_common.dir/texinterface.cpp.o gle/CMakeFiles/gle_common.dir/d_ps.cpp.o gle/CMakeFiles/gle_common.dir/d_svg.cpp.o gle/CMakeFiles/gle_common.dir/d_x.cpp.o gle/CMakeFiles/gle_common.dir/d_dummy.cpp.o gle/CMakeFiles/gle_common.dir/d_cairo.cpp.o gle/CMakeFiles/gle_common.dir/config.cpp.o gle/CMakeFiles/gle_common.dir/numberformat.cpp.o gle/CMakeFiles/gle_common.dir/glearray.cpp.o gle/CMakeFiles/gle_common.dir/cmdline.cpp.o gle/CMakeFiles/gle_common.dir/gle-block.cpp.o gle/CMakeFiles/gle_common.dir/gle-sourcefile.cpp.o gle/CMakeFiles/gle_common.dir/gle-interface.cpp.o gle/CMakeFiles/gle_common.dir/gle-base.cpp.o gle/CMakeFiles/gle_common.dir/gle-datatype.cpp.o gle/CMakeFiles/gle_common.dir/gle-poppler.cpp.o gle/CMakeFiles/gle_common.dir/builtin-double.cpp.o gle/CMakeFiles/gle_common.dir/file_io.cpp.o gle/CMakeFiles/gle_common.dir/specialfunctions.cpp.o gle/CMakeFiles/libgle-graphics.dir/gle_cpp_lib.cpp.o /usr/lib64/libtiff.so /usr/lib64/libz.so /usr/lib64/libjpeg.so /usr/lib64/libpng.so /usr/lib64/libz.so /usr/lib64/libcairo.so /usr/lib64/libpixman-1.so /usr/lib64/liblzma.so /usr/lib64/libjpeg.so /usr/lib64/libpng.so /usr/lib64/libcairo.so /usr/lib64/libpixman-1.so /usr/lib64/liblzma.so && :
FAILED: gle/liblibgle-graphics.so
: && /usr/bin/x86_64-pc-linux-gnu-g++ -fPIC -pipe -march=native -fstack-protector-all -O2 -fdiagnostics-color=always -frecord-gcc-switches -flto=4 -Werror=odr -Werror=lto-type-mismatch -Werror=strict-aliasing -Wformat -Werror=format-security -Wl,-O1 -Wl,--as-needed -Wl,-z,pack-relative-relocs -flto=4 -Werror=odr -Werror=lto-type-mismatch -Werror=strict-aliasing -Wl,--defsym=__gentoo_check_ldflags__=0 -fPIC -shared -Wl,-soname,liblibgle-graphics.so -o gle/liblibgle-graphics.so gle/CMakeFiles/gle_common.dir/bitmap/img2ps.cpp.o gle/CMakeFiles/gle_common.dir/bitmap/lzwencode.cpp.o gle/CMakeFiles/gle_common.dir/bitmap/glegif.cpp.o gle/CMakeFiles/gle_common.dir/bitmap/glejpeg.cpp.o gle/CMakeFiles/gle_common.dir/bitmap/gletiff.cpp.o gle/CMakeFiles/gle_common.dir/bitmap/glepng.cpp.o gle/CMakeFiles/gle_common.dir/bitmap/ascii85.cpp.o gle/CMakeFiles/gle_common.dir/letzfitz/let.cpp.o gle/CMakeFiles/gle_common.dir/letzfitz/fit.cpp.o gle/CMakeFiles/gle_common.dir/letzfitz/ffit.cpp.o gle/CMakeFiles/gle_common.dir/surface/gsurface.cpp.o gle/CMakeFiles/gle_common.dir/surface/hide.cpp.o gle/CMakeFiles/gle_common.dir/surface/fcontour.cpp.o gle/CMakeFiles/gle_common.dir/surface/ffitcontour.cpp.o gle/CMakeFiles/gle_common.dir/surface/gcontour.cpp.o gle/CMakeFiles/gle_common.dir/tokens/Tokenizer.cpp.o gle/CMakeFiles/gle_common.dir/tokens/StringKeyHash.cpp.o gle/CMakeFiles/gle_common.dir/tokens/BinIO.cpp.o gle/CMakeFiles/gle_common.dir/axis.cpp.o gle/CMakeFiles/gle_common.dir/b_tab.cpp.o gle/CMakeFiles/gle_common.dir/b_text.cpp.o gle/CMakeFiles/gle_common.dir/begin.cpp.o gle/CMakeFiles/gle_common.dir/core.cpp.o gle/CMakeFiles/gle_common.dir/curve.cpp.o gle/CMakeFiles/gle_common.dir/color.cpp.o gle/CMakeFiles/gle_common.dir/drawit.cpp.o gle/CMakeFiles/gle_common.dir/eval.cpp.o gle/CMakeFiles/gle_common.dir/fitbez.cpp.o gle/CMakeFiles/gle_common.dir/fitcf.cpp.o gle/CMakeFiles/gle_common.dir/fn.cpp.o gle/CMakeFiles/gle_common.dir/font.cpp.o gle/CMakeFiles/gle_common.dir/general.cpp.o gle/CMakeFiles/gle_common.dir/op_def.cpp.o gle/CMakeFiles/gle_common.dir/gprint.cpp.o gle/CMakeFiles/gle_common.dir/graph.cpp.o gle/CMakeFiles/gle_common.dir/graph2.cpp.o gle/CMakeFiles/gle_common.dir/key.cpp.o gle/CMakeFiles/gle_common.dir/keyword.cpp.o gle/CMakeFiles/gle_common.dir/leastsq.cpp.o gle/CMakeFiles/gle_common.dir/memory.cpp.o gle/CMakeFiles/gle_common.dir/mychar.cpp.o gle/CMakeFiles/gle_common.dir/pass.cpp.o gle/CMakeFiles/gle_common.dir/polish.cpp.o gle/CMakeFiles/gle_common.dir/run.cpp.o gle/CMakeFiles/gle_common.dir/savgol.cpp.o gle/CMakeFiles/gle_common.dir/sub.cpp.o gle/CMakeFiles/gle_common.dir/tex.cpp.o gle/CMakeFiles/gle_common.dir/token.cpp.o gle/CMakeFiles/gle_common.dir/var.cpp.o gle/CMakeFiles/gle_common.dir/cutils.cpp.o gle/CMakeFiles/gle_common.dir/texinterface.cpp.o gle/CMakeFiles/gle_common.dir/d_ps.cpp.o gle/CMakeFiles/gle_common.dir/d_svg.cpp.o gle/CMakeFiles/gle_common.dir/d_x.cpp.o gle/CMakeFiles/gle_common.dir/d_dummy.cpp.o gle/CMakeFiles/gle_common.dir/d_cairo.cpp.o gle/CMakeFiles/gle_common.dir/config.cpp.o gle/CMakeFiles/gle_common.dir/numberformat.cpp.o gle/CMakeFiles/gle_common.dir/glearray.cpp.o gle/CMakeFiles/gle_common.dir/cmdline.cpp.o gle/CMakeFiles/gle_common.dir/gle-block.cpp.o gle/CMakeFiles/gle_common.dir/gle-sourcefile.cpp.o gle/CMakeFiles/gle_common.dir/gle-interface.cpp.o gle/CMakeFiles/gle_common.dir/gle-base.cpp.o gle/CMakeFiles/gle_common.dir/gle-datatype.cpp.o gle/CMakeFiles/gle_common.dir/gle-poppler.cpp.o gle/CMakeFiles/gle_common.dir/builtin-double.cpp.o gle/CMakeFiles/gle_common.dir/file_io.cpp.o gle/CMakeFiles/gle_common.dir/specialfunctions.cpp.o gle/CMakeFiles/libgle-graphics.dir/gle_cpp_lib.cpp.o /usr/lib64/libtiff.so /usr/lib64/libz.so /usr/lib64/libjpeg.so /usr/lib64/libpng.so /usr/lib64/libz.so /usr/lib64/libcairo.so /usr/lib64/libpixman-1.so /usr/lib64/liblzma.so /usr/lib64/libjpeg.so /usr/lib64/libpng.so /usr/lib64/libcairo.so /usr/lib64/libpixman-1.so /usr/lib64/liblzma.so && :
/var/tmp/portage/sci-visualization/gle-9999/work/gle-9999/src/gle/eval.cpp:97:8: error: type ‘struct keyw’ violates the C++ One Definition Rule [-Werror=odr]
97 | struct keyw
| ^
/var/tmp/portage/sci-visualization/gle-9999/work/gle-9999/src/gle/fn.cpp:58:8: note: a different type is defined in another translation unit
58 | struct keyw { const char *word; int index; int ret,np,p[5]; } keywfn[] = {
| ^
/var/tmp/portage/sci-visualization/gle-9999/work/gle-9999/src/gle/eval.cpp:99:15: note: the first difference of corresponding definitions is field ‘word’
99 | char *word;
| ^
/var/tmp/portage/sci-visualization/gle-9999/work/gle-9999/src/gle/fn.cpp:58:27: note: a field of same name but different type is defined in another translation unit
58 | struct keyw { const char *word; int index; int ret,np,p[5]; } keywfn[] = {
| ^
/var/tmp/portage/sci-visualization/gle-9999/work/gle-9999/src/gle/eval.cpp:97:8: note: type ‘char’ should match type ‘const char’
97 | struct keyw
| ^
/var/tmp/portage/sci-visualization/gle-9999/work/gle-9999/src/gle/core.cpp:1868:8: error: type ‘struct mark_struct’ violates the C++ One Definition Rule [-Werror=odr]
1868 | struct mark_struct { int ff; int cc; double rx; double ry; double scl; double x1; double x2; double y1; double y2; };
| ^
/var/tmp/portage/sci-visualization/gle-9999/work/gle-9999/src/gle/pass.cpp:2367:8: note: a different type is defined in another translation unit
2367 | struct mark_struct { const char *name; const char *font; int cc; double rx; double ry; double scl; bool center;};
| ^
/var/tmp/portage/sci-visualization/gle-9999/work/gle-9999/src/gle/core.cpp:1868:26: note: the first difference of corresponding definitions is field ‘ff’
1868 | struct mark_struct { int ff; int cc; double rx; double ry; double scl; double x1; double x2; double y1; double y2; };
| ^
/var/tmp/portage/sci-visualization/gle-9999/work/gle-9999/src/gle/pass.cpp:2367:34: note: a field with different name is defined in another translation unit
2367 | struct mark_struct { const char *name; const char *font; int cc; double rx; double ry; double scl; bool center;};
| ^
lto1: some warnings being treated as errors
lto-wrapper: fatal error: /usr/bin/x86_64-pc-linux-gnu-g++ returned 1 exit status
compilation terminated.
/usr/libexec/gcc/x86_64-pc-linux-gnu/ld: error: lto-wrapper failed
collect2: error: ld returned 1 exit status
ninja: build stopped: cannot make progress due to previous errors.
Originally reported downstream: https://bugs.gentoo.org/927779 Full build log: build.log
error: type ‘…’ violates the C++ One Definition Rule [-Werror=odr]
This message can also be seen—as a warning—in the GitHub Actions logs for ubuntu-latest in this repository, which builds using gcc. Such a message is not seen in the macos-latest jobs; those use clang.
Yup -- clang is generally unable to diagnose this sort of thing as its LTO implementation doesn't retain the rich annotations gcc does.
can LTO be disabled in this instance?
Disabling LTO does not fix the issue whereby the C++ One Definition Rule is being broken resulting in Undefined Behavior.
Sure, you can not build with LTO. The bug is still there but then the compiler won't be able to warn you about the bug. Is that an improvement? I don't think so.
I threw this at copilot and this is the response. I'll give it a look. This is a result of the over 30 year old messy GLE code being thrown at new compilers that are not so forgiving.
This means the same struct keyw is defined differently in multiple translation units (source files). Specifically:
In eval.cpp, keyw has a member char *word
In fn.cpp, keyw has const char *word
This violates the One Definition Rule (ODR) in C++, which requires that a type must have exactly one definition across all translation units.
Similarly, mark_struct is also defined differently in another file, triggering another ODR violation.
🧩 How to Fix It To resolve this:
Unify the struct definitions: Ensure struct keyw and struct mark_struct are defined identically in all files.
Use a shared header file: Move the struct definitions to a .h file and include it wherever needed.
Avoid duplicate definitions: Never redefine the same struct in multiple .cpp files.
I threw this at copilot and this is the response.
That ... Sounds like an awfully expensive way to get told "here is the original input, reworded slightly to be a bit more verbose" followed by "resolve this by not doing the thing that is an error". 😕
It's also most likely wrong. There are two general approaches to fixing this, and one of them is treating the fact that the two definitions differ in content as a mistake to be fixed, the other is to treat the fact that the two definitions have the same name as a mistake to be fixed. If they have the same name but store totally separate data with a different structure and do totally different things then they simply need to be renamed.
Well, I found the response helpful. It said that If they are the same content then the definition should be unified. If not rename them. Which I think is what you are saying correct?
After looking at the code it appears (at least for keyw) that it is the same content.
and moving this
struct keyw { const char *word; int index; int ret,np,p[5]; }
to a common header will solve this issue.
mark_struct are different. and was fixed in this commit. 8ac717dc076179f49a553c692413f3f4186087c6 a new commit is coming to fix the keyw issue which are the same
Commit 9b39b0950aa4fac5f28be7dcd85956544bf172c3 moves the definition of keyw to fn.h to resolve this issue.
@vlabella thanks.
Note that it's possible to automatically associate a commit with an issue that the commit has fixed. See for example https://github.blog/news-insights/product-news/closing-issues-via-commit-messages/
closing issue - workflows succeeded without errors.