CMake 2.6 Notes: Difference between revisions

From KitwarePublic
Jump to navigationJump to search
m (CMake Linking moved to CMake 2.6 Linking: Better name.)
(Replace content with link to new CMake community wiki)
 
(58 intermediate revisions by 4 users not shown)
Line 1: Line 1:
CMake 2.6 implements a new approach to generating link lines for targets.
{{CMake/Template/Moved}}


Consider these libraries:
This page has moved [https://gitlab.kitware.com/cmake/community/wikis/doc/cmake/notes/2.6 here].
 
  /path/to/libfoo.a
  /path/to/libfoo.so
 
Previously if someone wrote
 
  target_link_libraries(myexe /path/to/libfoo.a)
 
CMake would generate this code to link it:
 
  ... -L/path/to -Wl,-Bstatic -lfoo -Wl,-Bdynamic ...
 
This worked most of the time, but some platforms (such as OS X) do not
support the -Bstatic or equivalent flag.  This made it impossible to
link to the static version of a library without creating a symlink in
another directory and using that one instead.
 
Now CMake will generate this code:
 
  ... /path/to/libfoo.a ...
 
This guarantees that the correct library is chosen.
 
There is a side-effect of this fix.  Projects used to be able to write
this (wrong) code and it would work by accident:
 
  add_executable(myexe myexe.c)
  target_link_libraries(myexe /path/to/libA.so B)
 
where "B" is meant to link "/path/to/libB.so". This code is incorrect
because it asks CMake to link to B but does not provide the proper
linker search path for it. It used to work by accident because the
-L/path/to would get added as part of the implementation of linking to
A.  The correct code would be
 
  link_directories(/path/to)
  add_executable(myexe myexe.c)
  target_link_libraries(myexe /path/to/libA.so B)
 
or even better
 
  add_executable(myexe myexe.c)
  target_link_libraries(myexe /path/to/libA.so /path/to/libB.so)
 
In order to support projects that have this bug, we've added a
compatibility feature that adds the "-L/path/to" paths for all libraries
linked with full paths even though the linker will not need those paths
to find the main libraries.  The compatibility mode is enabled when a
link line contains a non-full-path library (like B or -lB) and either
CMAKE_BACKWARDS_COMPATIBILITY is set to 2.4 or lower or
CMAKE_LINK_OLD_PATHS is set to true.

Latest revision as of 15:41, 30 April 2018


The CMake community Wiki has moved to the Kitware GitLab Instance.

This page has moved here.