OpenCV 2.4.13 compilation under Mac using CMake 3.5
Contents
The library versions using in this article: OpenCV2.4.13, FFMpeg 2.8.7, CMake 3.5.
First of all, you need to install FFMpeg on Mac OSX first. The step is very easy just like doing it on other Unix/Linux platform.
Then download OpenCV 2.4.13 and unzip it to a folder. Enter this folder from terminal and here are basic steps for OpenCV 2.4.13 compilation under Mac:
mkdir build cd build cmake -G “Unix Makefiles” .. make -j8 sudo make install
According to OpenCV version and FFMpeg dependency, you might meet some compilation errors.
Error 1: not generating corresponding makefile
Here is an example error message:
In file included from /Users/collins/Documents/temp/opencv-2.4.13/3rdparty/zlib/zlib.h:34:
/Users/collins/Documents/temp/opencv-2.4.13/release/3rdparty/zlib/zconf.h:426:14: fatal error:
'sys/types.h' file not found
include <sys/types.h> /* for off_t */
^
1 error generated.
Try to generate correct makefile on Mac, you should use following parameters in cmake command:
cmake -G “Unix Makefiles” ..
So your final OpenCV project generating cmake parameters should be something like this:
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -G “Unix Makefiles” ..
Error 2: link CoreMedia, VideoToolBox frameworks or something else on Mac
An example error message is as following:
[ 33%] Building CXX object modules/highgui/CMakeFiles/opencv_highgui.dir/src/bitstrm.cpp.o
[ 33%] Linking CXX shared library ../../lib/libopencv_highgui.dylib
Undefined symbols for architecture x86_64:
“_CMBlockBufferCreateWithMemoryBlock”, referenced from:
\_videotoolbox\_common\_end\_frame in libavcodec.a(videotoolbox.o)
“_CMSampleBufferCreate”, referenced from:
\_videotoolbox\_common\_end\_frame in libavcodec.a(videotoolbox.o)
“_CMVideoFormatDescriptionCreate”, referenced from:
\_av\_videotoolbox\_default\_init2 in libavcodec.a(videotoolbox.o)
“_SSLClose”, referenced from:
\_tls\_open in libavformat.a(tls\_securetransport.o)
\_tls\_close in libavformat.a(tls\_securetransport.o)
“_SSLCopyPeerTrust”, referenced from:
The reason of above error message is that some FFMpeg version under Mac is depended on VideoToolBox & CoreMedia Frameworks.
The solution is to modify and add following code into opencv-x.x.x/modules/highgui/CMakeLists.txt file:
find_library(CORE_MEDIA CoreMedia) if (NOT CORE_MEDIA) message(FATAL_ERROR “CoreMedia not found”) endif()
find_library(VIDEO_TOOL_BOX VideoToolBox) if (NOT VIDEO_TOOL_BOX) message(FATAL_ERROR “VideoToolBox not found”) endif()
find_library(SECURITY Security) if (NOT SECURITY) message(FATAL_ERROR “Security not found”) endif()
target_link_libraries(${the_module} ${CORE_MEDIA} ${VIDEO_TOOL_BOX} ${SECURITY})
So at the compilation time, it will link VideoToolBox, CoreMedia, Security frameworks under System/Library/Frameworks folder.
Another solution is not to compile highgui library, you can do this such kind of thing like this:
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D BUILD_opencv_highgui=OFF -G “Unix Makefiles” ..
Adding CoreMedia & VideoToolBox libraries is not enough, You might still get following errors:
ld: warning: directory not found for option ‘-L/usr/local/lib/Debug’ ld: warning: directory not found for option ‘-L/usr/local/Cellar/x264/r2601/lib/Debug’ ld: warning: directory not found for option ‘-L/usr/local/Cellar/libvpx/1.5.0/lib/Debug’ ld: warning: directory not found for option ‘-L/usr/local/Cellar/opus/1.1.1/lib/Debug’ ld: warning: directory not found for option ‘-L/usr/local/Cellar/freetype/2.6_1/lib/Debug’ ld: warning: directory not found for option ‘-L/usr/local/Cellar/fdk-aac/0.1.4/lib/Debug’ ld: warning: directory not found for option ‘-L/usr/local/Cellar/libass/0.13.1/lib/Debug’ Undefined symbols for architecture x86_64: “_SSLClose”, referenced from: _tls_open in libavformat.a(tls_securetransport.o) _tls_close in libavformat.a(tls_securetransport.o) “_SSLCopyPeerTrust”, referenced from: _tls_open in libavformat.a(tls_securetransport.o) “_SSLCreateContext”, referenced from: _tls_open in libavformat.a(tls_securetransport.o) “_SSLHandshake”, referenced from: _tls_open in libavformat.a(tls_securetransport.o) “_SSLRead”, referenced from: _tls_read in libavformat.a(tls_securetransport.o) “_SSLSetCertificate”, referenced from:
That’s the reason why I need to add security.framework to CMakeLists.txt file.
According to different OpenCV & FFMpeg version, you might try to link other frameworks this way by your self to make sure you can install OpenCV successfully.
Author Watterry
LastMod 2016-08-12