I'm trying to build an OpenCV-based project using CMake, running on Linux. So far my CMakeLists.txt
files looks something like
FIND_PACKAGE (OpenCV REQUIRED)
...
TARGET_LINK_LIBRARIES (my-executable ${OpenCV_LIBS})
but this results in dynamically linked libraries. How do I link with static libraries?
on the add_library line specify static. See http://www.cmake.org/cmake/help/cmake-2-8-docs.html#command:add_library
Correction since you are looking to link against a static library I would look into the CMAKE_FIND_LIBRARY_SUFFIXES property
To link everything statically, I believe you're looking for
CMAKE_EXE_LINKER_FLAGS
(add-static
).Are you using the 'simple method' of OpenCVConfig.cmake? or the older FindOpenCV.cmake?
AFAIK that's a bit tricky, because CMake, more precisely the find_library command, prefers shared libs and finds those if both shared and static are available.
I'm still looking for a good solution myself to be able to compile binaries "as static as possible", but I've found no elegant solution yet. The only way it would surely work is to implement everything through custom FindXXXX modules.
You build static OpenCV libraries by just setting the
BUILD_SHARED_LIBS
flag to false in CMake. Then all you need to do to build your own application with those static libraries is to add a dependency on OpenCV in yourCMakeLists.txt
:and CMake will take care of everything.
Actually this issue seems to have already been fixed in the
OpenCVConfig.cmake
that comes with OpenCV. All you have to do is defineOpenCV_STATIC
in yourCMakeLists.txt
. I.e.Note that gcc refuses to link if you pass the -static option, but you have dynamic libs in the link arguments - which you will if you just simply use FindOpenCV.cmake and this picks up the dynamic libs (I don't know how OpenCVConfig.cmake behaves though)...