compressonator
compressonator copied to clipboard
[v4.2] OpenEXR-related build failure on Arch Linux
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?
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?
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.