If you’ve ever tried to build ZoneMinder from source and been frustrated by the following compile error, then I hope this helps you.
[ 30%] Building CXX object src/CMakeFiles/zm.dir/zm_image.cpp.o
/u1/src/ZoneMinder/src/zm_image.cpp: In member function ‘bool Image::ReadRaw(const char*)’:
/u1/src/ZoneMinder/src/zm_image.cpp:616:27: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
/u1/src/ZoneMinder/src/zm_image.cpp: In member function ‘bool Image::ReadJpeg(const char*, unsigned int, unsigned int)’:
/u1/src/ZoneMinder/src/zm_image.cpp:664:5: error: ‘JPEG_LIB_VERSION’ was not declared in this scope
/u1/src/ZoneMinder/src/zm_image.cpp: In member function ‘bool Image::WriteJpeg(const char*, int, timeval) const’:
/u1/src/ZoneMinder/src/zm_image.cpp:825:5: error: ‘JPEG_LIB_VERSION’ was not declared in this scope
/u1/src/ZoneMinder/src/zm_image.cpp: In member function ‘bool Image::DecodeJpeg(const JOCTET*, int, unsigned int, unsigned int)’:
/u1/src/ZoneMinder/src/zm_image.cpp:956:5: error: ‘JPEG_LIB_VERSION’ was not declared in this scope
/u1/src/ZoneMinder/src/zm_image.cpp: In member function ‘bool Image::EncodeJpeg(JOCTET*, int*, int) const’:
/u1/src/ZoneMinder/src/zm_image.cpp:1090:5: error: ‘JPEG_LIB_VERSION’ was not declared in this scope
make[2]: *** [src/CMakeFiles/zm.dir/zm_image.cpp.o] Error 1
make[1]: *** [src/CMakeFiles/zm.dir/all] Error 2
make: *** [all] Error 2
jpeglib-turbo/include/jconfig.h (from your installed jpeglib-turbo-dev) has:
#define JPEG_LIB_VERSION 62
And to avoid including this more than once the wrapper libjpeg-turbo/include/jpeglib.h has:
#ifndef JCONFIG_INCLUDED /* in case jinclude.h already did */ #include "jconfig.h" /* widely used configuration options */ #endif
So far so good… The problem comes when zoneminder wants to compile zm_image.cpp
the include path is:
zm_image.cpp -> zm_image.h -> zm_jpeg.h -> jinclude.h -> jconfig.h (from jpeglib-turbo) -> jpeglib.h (from jpeglib-turbo)
Now, this *should* all work properly! I suspect it has something to do with cmake and scope and by the time we get back to jinclude.h it no longer has the define.
My fix was to take the version from my jpeglib-turbo/include/jconfig.h and simply add it to zoneminder’s jinclude.h:
#include "jconfig.h" /* auto configuration options */ #define JCONFIG_INCLUDED /* so that jpeglib.h doesn't do it again */ #ifndef JPEG_LIB_VERSION #define JPEG_LIB_VERSION 62 #endif
Add the 3 blue lines after the jconfig.h include. Once done, compile should complete properly.
Hope this helps other get past this hurdle.