[CMake] Find Library would not find the library
Michael Hertling
mhertling at online.de
Fri Mar 11 09:58:35 EST 2011
On 03/10/2011 12:25 AM, Andreas Pakulat wrote:
> On 09.03.11 21:36:25, Ankur Handa wrote:
>> I'm using find_library to find a library in a given directory but it has
>> many different versions of this library listed as libcxcore.so,
>> libcxcore.so.2.1 and libcxcore.so.2.1.0 I wrote a very simple cmake file
>>
>> cmake_minimum_required(VERSION 2.8)
>>
>> find_library(OpenCV_LIBRARY_RELEASE NAMES "cxcore" PATHS
>> "/homes/ahanda/openCV2.1/OpenCV-2.1.0/opencvinstall/lib" NO_DEFAULT_PATH)
>>
>> if ( OpenCV_LIBRARY_RELEASE)
>> message("LIBRARY FOUND = " ${OpenCV_LIBRARY_RELEASE})
>> endif()
>>
>> if ( NOT OpenCV_LIBRARY_RELEASE)
>> message("LIBRARY NOT FOUND")
>> endif()
>>
>> It works fine if I search for "cxcore" for which it returns me libcxcore.so
>> and the OpenCV_LIBRARY_RELEASE
>> as /homes/ahanda/openCV2.1/OpenCV-2.1.0/opencvinstall/lib/libcxcore.so
>>
>> However if I try to search for cxcore21 or cxcore210 or even
>> libcxcore.so.2.1.0 it won't return me anything and I'd always see LIBRARY
>> NOT FOUND being printed.
>>
>> Could anyone please let me know how to really search for libcxcore.so.2.1.0
>
> You can't I think. Thats simply not how cmake or the linker work. The
> linker during the compilation phase will always link against
> lib<name>.so. So you need to make sure that your lib<name>.so is from
> cxcore 2.1.0 and search simply for cxcore.
The linker exactly links against what is denoted on the command line,
so if you mention /homes/ahanda/.../libcxcore.so.2.1.0 directly, it
will take right this file for resolving symbols regardless whether
and how the libcxcore.so symlink is set.
The OP's issue is that FIND_LIBRARY() is somewhat restricted w.r.t. the
names of the library to look for; AFAICS, it works roughly as follows:
- If the user-supplied name in consideration has a valid library suffix
- specified by CMAKE_FIND_LIBRARY_SUFFIXES - it is searched literally.
- If no literally matching library is found, FIND_LIBRARY() looks for a
concatenation of the library prefixes in CMAKE_FIND_LIBRARY_PREFIXES,
the supplied name and the library suffixes as a regular expression,
i.e. (lib)<name>(\.so|\.a) on *nix.
Hence, FIND_LIBRARY() can't find libcxcore.so.2.1.0 even if the latter
is specified literally because ".so.2.1.0" is no valid library suffix.
A possible solution - provided that one definitely knows that exactly
libcxcore.so.2.1.0 should be found - is to temporarily add ".so.2.1.0"
to CMAKE_FIND_LIBRARY_SUFFIXES. So, Ankur, try
LIST(APPEND CMAKE_FIND_LIBRARY_SUFFIXES ".so.2.1.0")
FIND_LIBRARY(OpenCV_LIBRARY_RELEASE NAMES "libcxcore.so.2.1.0" ...)
LIST(REMOVE_ITEM CMAKE_FIND_LIBRARY_SUFFIXES ".so.2.1.0")
and you'll probably see libcxcore.so.2.1.0 being found. Alternatively,
you might use FIND_PATH() or FIND_FILE() to search libcxcore.so.2.1.0,
but in that way, you would lose FIND_LIBRARY()'s special capabilities,
e.g. looking in CMAKE_LIBRARY_PATH or CMAKE_PREFIX_PATH/lib.
Regards,
Michael
More information about the CMake
mailing list