[CMake] linking to arbitrary libraries in linux.

Philip Lowman philip at yhbt.com
Thu Feb 28 00:17:59 EST 2008


On Wed, Feb 27, 2008 at 8:08 PM, Christopher Harvey <arbuckle911 at gmail.com>
wrote:

> Philip Lowman wrote:
> > On Wed, Feb 27, 2008 at 7:13 PM, Christopher Harvey
> > <arbuckle911 at gmail.com <mailto:arbuckle911 at gmail.com>> wrote:
> >
> >     Hi,
> >     Before I ask my question I want to clarify what I mean by an
> >     "arbitrary
> >     library". There are libraries that are registered in the system
> >     and you
> >     can link to them like so:
> >     target_link_library(targetName GL SDL pq)
> >     and they get sent to the linker int the form:
> >     -lGL -lSDL -lpq
> >     that fine, but I have a file in the form libName.a and I compiled it
> >     from source and it's not in the /usr/lib directory. It's just
> >     sitting in
> >     my project directory. how can I tell cmake not to turn
> >     target_link_libraries(targetName libName.a) into -lName, but keep
> the
> >     original so the linker can find it?
> >
> >
> > This works for me in CMake 2.4.8:
> >
> > TARGET_LINK_LIBRARIES(target ${PROJECT_SOURCE_DIR}/libFoo.a)
> >
> >
> >
> > /usr/bin/c++      -fPIC "CMakeFiles/bar.dir/bar.o"   -o bar -rdynamic
> > -L/home/lowman/tmp/foo -Wl,-Bstatic -lfoo -Wl,-Bdynamic
> > -Wl,-rpath,/home/lowman/tmp/foo
> >
> >
> > --
> > Philip Lowman
> Hi Philip,
> thanks, that's almost working. Now I've got:
> target_link_libraries(target ../foolib/libFoo.a)
>
> this produces:
>
> /usr/lib/gcc/x86_64-pc-linux-gnu/4.1.2/../../../../x86_64-pc-linux-gnu/bin/ld:
> cannot find -l../foolib/libFoo.a
>
> It would work if it looked for "../foolib/libFoo.a" and not
> "-l../foolib/libFoo.a"
> Any idea as to how to fix this?
>

If you're trying to link against a library that's outside of your source
tree, you should always use FIND_LIBRARY then TARGET_LINK_LIBRARIES.
FIND_LIBRARY will almost always do exactly what you want if you give it the
NO_DEFAULT_PATHS option and specify the path to the library you want to
find.  In the event you have a ".so" and ".a" in the same directory you
should be made aware that it always prefers the ".so".  This behavior has
been fixed in CMake CVS so you can specify the ".a" file directly if you
encounter this situation.

If you're trying to link against a library that's inside your source tree
you can reference it relative to ${PROJECT_SOURCE_DIR} or one of the other
variables that defines directories in your source tree, like
${CMAKE_CURRENT_SOURCE_DIR}.  Apparently, relative paths will not work for
this though (as you've discovered).  See this page for details on variables
you can use:

http://www.cmake.org/Wiki/CMake_Useful_Variables



-- 
Philip Lowman



-- 
Philip Lowman
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://public.kitware.com/pipermail/cmake/attachments/20080228/6b670897/attachment.html


More information about the CMake mailing list