compressonator icon indicating copy to clipboard operation
compressonator copied to clipboard

[v4.2] OpenEXR-related build failure on Arch Linux

Open BabylonAS opened this issue 3 years ago • 2 comments

So I’m trying to build Compressonator on Arch Linux (using gcc 11.1.0, Qt 5.15.2, cmake 3.21.4). After cloning the repository and dealing with dependencies, I could start compiling the program but it failed at building the EXR plugin. Excuse my Russian-language compiler comments (“ошибка” means “error”), but it appears as if some types are incomplete:

[ 56%] Building CXX object applications/_plugins/cimage/exr/CMakeFiles/Image_EXR.dir/__/__/common/tc_plugininternal.cpp.o
[ 57%] Building CXX object applications/_plugins/cimage/exr/CMakeFiles/Image_EXR.dir/__/__/common/utilfuncs.cpp.o
[ 57%] Building CXX object applications/_plugins/cimage/exr/CMakeFiles/Image_EXR.dir/__/__/common/cmp_fileio.cpp.o
/home/babylonas/dev/Compressonator/applications/_plugins/common/cmp_fileio.cpp: В функции «bool CMP_IsHidden(const string&)»:
/home/babylonas/dev/Compressonator/applications/_plugins/common/cmp_fileio.cpp:341:1: предупреждение: управление достигает конца не-void функции [-Wreturn-type]
  341 | }
      | ^
[ 57%] Building CXX object applications/_plugins/cimage/exr/CMakeFiles/Image_EXR.dir/__/__/common/cexr.cpp.o
[ 57%] Building CXX object applications/_plugins/cimage/exr/CMakeFiles/Image_EXR.dir/exr.cpp.o
/home/babylonas/dev/Compressonator/applications/_plugins/cimage/exr/exr.cpp: В функции «int loadDeepScanlineImage(Imf_3_1::MultiPartInputFile&, int&, Imf_3_1::Header&, Imf_3_1::Array<Imf_3_1::Rgba>&, Imf_3_1::Array<float*>&, Imf_3_1::Array<unsigned int>&, bool, MipSet*)»:
/home/babylonas/dev/Compressonator/applications/_plugins/cimage/exr/exr.cpp:769:21: ошибка: агрегатный тип «Imf_3_1::DeepFrameBuffer fb» неполон и не может быть определён
  769 |     DeepFrameBuffer fb;
      |                     ^~
/home/babylonas/dev/Compressonator/applications/_plugins/cimage/exr/exr.cpp:782:42: ошибка: некорректное использование неполного типа «struct Imf_3_1::DeepSlice»
  782 |                         sizeof(float) * 1));    // stride for z data sample
      |                                          ^
In file included from /usr/include/OpenEXR/ImfArray.h:10,
                 from /home/babylonas/dev/Compressonator/applications/_plugins/common/cexr.h:34,
                 from /home/babylonas/dev/Compressonator/applications/_plugins/cimage/exr/exr.cpp:71:
/usr/include/OpenEXR/ImfForward.h:77:24: замечание: forward декларация «struct Imf_3_1::DeepSlice»
   77 | struct IMF_EXPORT_TYPE DeepSlice;
      |                        ^~~~~~~~~
/home/babylonas/dev/Compressonator/applications/_plugins/cimage/exr/exr.cpp:788:42: ошибка: некорректное использование неполного типа «struct Imf_3_1::DeepSlice»
  788 |                         sizeof(float) * 1));    // stride for z data sample
      |                                          ^
In file included from /usr/include/OpenEXR/ImfArray.h:10,
                 from /home/babylonas/dev/Compressonator/applications/_plugins/common/cexr.h:34,
                 from /home/babylonas/dev/Compressonator/applications/_plugins/cimage/exr/exr.cpp:71:
/usr/include/OpenEXR/ImfForward.h:77:24: замечание: forward декларация «struct Imf_3_1::DeepSlice»
   77 | struct IMF_EXPORT_TYPE DeepSlice;
      |                        ^~~~~~~~~
/home/babylonas/dev/Compressonator/applications/_plugins/cimage/exr/exr.cpp:796:49: ошибка: некорректное использование неполного типа «struct Imf_3_1::DeepSlice»
  796 |                             sizeof(CMP_HALF) * 1));
      |                                                 ^
In file included from /usr/include/OpenEXR/ImfArray.h:10,
                 from /home/babylonas/dev/Compressonator/applications/_plugins/common/cexr.h:34,
                 from /home/babylonas/dev/Compressonator/applications/_plugins/cimage/exr/exr.cpp:71:
/usr/include/OpenEXR/ImfForward.h:77:24: замечание: forward декларация «struct Imf_3_1::DeepSlice»
   77 | struct IMF_EXPORT_TYPE DeepSlice;
      |                        ^~~~~~~~~
/home/babylonas/dev/Compressonator/applications/_plugins/cimage/exr/exr.cpp:803:49: ошибка: некорректное использование неполного типа «struct Imf_3_1::DeepSlice»
  803 |                             sizeof(CMP_HALF) * 1));
      |                                                 ^
In file included from /usr/include/OpenEXR/ImfArray.h:10,
                 from /home/babylonas/dev/Compressonator/applications/_plugins/common/cexr.h:34,
                 from /home/babylonas/dev/Compressonator/applications/_plugins/cimage/exr/exr.cpp:71:
/usr/include/OpenEXR/ImfForward.h:77:24: замечание: forward декларация «struct Imf_3_1::DeepSlice»
   77 | struct IMF_EXPORT_TYPE DeepSlice;
      |                        ^~~~~~~~~
/home/babylonas/dev/Compressonator/applications/_plugins/cimage/exr/exr.cpp:810:49: ошибка: некорректное использование неполного типа «struct Imf_3_1::DeepSlice»
  810 |                             sizeof(CMP_HALF) * 1));
      |                                                 ^
In file included from /usr/include/OpenEXR/ImfArray.h:10,
                 from /home/babylonas/dev/Compressonator/applications/_plugins/common/cexr.h:34,
                 from /home/babylonas/dev/Compressonator/applications/_plugins/cimage/exr/exr.cpp:71:
/usr/include/OpenEXR/ImfForward.h:77:24: замечание: forward декларация «struct Imf_3_1::DeepSlice»
   77 | struct IMF_EXPORT_TYPE DeepSlice;
      |                        ^~~~~~~~~
/home/babylonas/dev/Compressonator/applications/_plugins/cimage/exr/exr.cpp:820:28: ошибка: некорректное использование неполного типа «struct Imf_3_1::DeepSlice»
  820 |                         1.0));                  // fillValue
      |                            ^
In file included from /usr/include/OpenEXR/ImfArray.h:10,
                 from /home/babylonas/dev/Compressonator/applications/_plugins/common/cexr.h:34,
                 from /home/babylonas/dev/Compressonator/applications/_plugins/cimage/exr/exr.cpp:71:
/usr/include/OpenEXR/ImfForward.h:77:24: замечание: forward декларация «struct Imf_3_1::DeepSlice»
   77 | struct IMF_EXPORT_TYPE DeepSlice;
      |                        ^~~~~~~~~
/home/babylonas/dev/Compressonator/applications/_plugins/cimage/exr/exr.cpp: В функции «int loadDeepTileImage(Imf_3_1::MultiPartInputFile&, int&, Imf_3_1::Header&, Imf_3_1::Array<Imf_3_1::Rgba>&, Imf_3_1::Array<float*>&, Imf_3_1::Array<unsigned int>&, bool, MipSet*)»:
/home/babylonas/dev/Compressonator/applications/_plugins/cimage/exr/exr.cpp:959:21: ошибка: агрегатный тип «Imf_3_1::DeepFrameBuffer fb» неполон и не может быть определён
  959 |     DeepFrameBuffer fb;
      |                     ^~
/home/babylonas/dev/Compressonator/applications/_plugins/cimage/exr/exr.cpp:972:42: ошибка: некорректное использование неполного типа «struct Imf_3_1::DeepSlice»
  972 |                         sizeof(float) * 1));    // stride for z data sample
      |                                          ^
In file included from /usr/include/OpenEXR/ImfArray.h:10,
                 from /home/babylonas/dev/Compressonator/applications/_plugins/common/cexr.h:34,
                 from /home/babylonas/dev/Compressonator/applications/_plugins/cimage/exr/exr.cpp:71:
/usr/include/OpenEXR/ImfForward.h:77:24: замечание: forward декларация «struct Imf_3_1::DeepSlice»
   77 | struct IMF_EXPORT_TYPE DeepSlice;
      |                        ^~~~~~~~~
/home/babylonas/dev/Compressonator/applications/_plugins/cimage/exr/exr.cpp:978:42: ошибка: некорректное использование неполного типа «struct Imf_3_1::DeepSlice»
  978 |                         sizeof(float) * 1));    // stride for z data sample
      |                                          ^
In file included from /usr/include/OpenEXR/ImfArray.h:10,
                 from /home/babylonas/dev/Compressonator/applications/_plugins/common/cexr.h:34,
                 from /home/babylonas/dev/Compressonator/applications/_plugins/cimage/exr/exr.cpp:71:
/usr/include/OpenEXR/ImfForward.h:77:24: замечание: forward декларация «struct Imf_3_1::DeepSlice»
   77 | struct IMF_EXPORT_TYPE DeepSlice;
      |                        ^~~~~~~~~
/home/babylonas/dev/Compressonator/applications/_plugins/cimage/exr/exr.cpp:986:49: ошибка: некорректное использование неполного типа «struct Imf_3_1::DeepSlice»
  986 |                             sizeof(CMP_HALF) * 1));
      |                                                 ^
In file included from /usr/include/OpenEXR/ImfArray.h:10,
                 from /home/babylonas/dev/Compressonator/applications/_plugins/common/cexr.h:34,
                 from /home/babylonas/dev/Compressonator/applications/_plugins/cimage/exr/exr.cpp:71:
/usr/include/OpenEXR/ImfForward.h:77:24: замечание: forward декларация «struct Imf_3_1::DeepSlice»
   77 | struct IMF_EXPORT_TYPE DeepSlice;
      |                        ^~~~~~~~~
/home/babylonas/dev/Compressonator/applications/_plugins/cimage/exr/exr.cpp:993:49: ошибка: некорректное использование неполного типа «struct Imf_3_1::DeepSlice»
  993 |                             sizeof(CMP_HALF) * 1));
      |                                                 ^
In file included from /usr/include/OpenEXR/ImfArray.h:10,
                 from /home/babylonas/dev/Compressonator/applications/_plugins/common/cexr.h:34,
                 from /home/babylonas/dev/Compressonator/applications/_plugins/cimage/exr/exr.cpp:71:
/usr/include/OpenEXR/ImfForward.h:77:24: замечание: forward декларация «struct Imf_3_1::DeepSlice»
   77 | struct IMF_EXPORT_TYPE DeepSlice;
      |                        ^~~~~~~~~
/home/babylonas/dev/Compressonator/applications/_plugins/cimage/exr/exr.cpp:1000:49: ошибка: некорректное использование неполного типа «struct Imf_3_1::DeepSlice»
 1000 |                             sizeof(CMP_HALF) * 1));
      |                                                 ^
In file included from /usr/include/OpenEXR/ImfArray.h:10,
                 from /home/babylonas/dev/Compressonator/applications/_plugins/common/cexr.h:34,
                 from /home/babylonas/dev/Compressonator/applications/_plugins/cimage/exr/exr.cpp:71:
/usr/include/OpenEXR/ImfForward.h:77:24: замечание: forward декларация «struct Imf_3_1::DeepSlice»
   77 | struct IMF_EXPORT_TYPE DeepSlice;
      |                        ^~~~~~~~~
/home/babylonas/dev/Compressonator/applications/_plugins/cimage/exr/exr.cpp:1012:28: ошибка: некорректное использование неполного типа «struct Imf_3_1::DeepSlice»
 1012 |                         1.0));                  // fillValue
      |                            ^
In file included from /usr/include/OpenEXR/ImfArray.h:10,
                 from /home/babylonas/dev/Compressonator/applications/_plugins/common/cexr.h:34,
                 from /home/babylonas/dev/Compressonator/applications/_plugins/cimage/exr/exr.cpp:71:
/usr/include/OpenEXR/ImfForward.h:77:24: замечание: forward декларация «struct Imf_3_1::DeepSlice»
   77 | struct IMF_EXPORT_TYPE DeepSlice;
      |                        ^~~~~~~~~
make[2]: *** [applications/_plugins/cimage/exr/CMakeFiles/Image_EXR.dir/build.make:132: applications/_plugins/cimage/exr/CMakeFiles/Image_EXR.dir/exr.cpp.o] Ошибка 1
make[1]: *** [CMakeFiles/Makefile2:582: applications/_plugins/cimage/exr/CMakeFiles/Image_EXR.dir/all] Ошибка 2
make: *** [Makefile:91: all] Ошибка 2

It appears that instead of OpenEXR 2.2 header files, which are downloaded as part of a dependency, the compiler chose the headers for OpenEXR 3.1, which is installed on my Arch as a proper system package that is required for e. g. GIMP and Blender. Is there a way to force the usage of EXR 2.2 headers when preparing for compilation?

BabylonAS avatar Nov 05 '21 20:11 BabylonAS

As it turned out, I haven’t built OpenEXR 2.2 in the first place. Now I have the header files (at /usr/local/include/OpenEXR) and libs (at /usr/local/lib), and while I’ve figured out how to specify the include folder, it still tries to pull the OpenEXR 3.1 library files which are at /usr/lib (and which are pointed at by pkg-config). How do I make sure the 2.2 libs are used?

BabylonAS avatar Nov 06 '21 16:11 BabylonAS

I fixed this build issue by adding an include that got OpenEXR 3 working:

diff --git a/applications/_plugins/cimage/exr/exr.cpp b/applications/_plugins/cimage/exr/exr.cpp
index 2ded86ff..77ad0821 100644
--- a/applications/_plugins/cimage/exr/exr.cpp
+++ b/applications/_plugins/cimage/exr/exr.cpp
@@ -85,6 +85,7 @@ IMath.lib;Half.lib;IlmImf.lib;IlmThread.lib;Iex.lib;zlibstatic_d.lib;
 #include <ImfPreviewImage.h>
 #include <ImfDeepScanLineInputPart.h>
 #include <ImfCompositeDeepScanLine.h>
+#include <ImfDeepFrameBuffer.h>
 #include <ImfPixelType.h>
 #include <ImathFun.h>
 #pragma warning( pop )

This got it building. I did have to install vtk though after a rather cryptic linking error.

expenses avatar May 21 '22 19:05 expenses