[CMake] Unix makefiles feature request

Brad King brad.king at kitware.com
Wed Jun 24 11:38:56 EDT 2009


Robert Bielik wrote:
> Ok, apologies if this is already implemented, just haven't seen it.
> 
> When making "Unix Makefiles", then link.txt script have archive files 
> (static libraries) listed in the
> order they appear in the TARGET_LINK_LIBRARIES directive.
> 
> The GCC linker (LD) has the peculiarity that if symbols are defined in 
> library A and library B needs them, but
> B is given on the LD command line after library A, linking will fail 
> with unresolved dependencies.
> 
> LD supports the directive --start-group/--end-group to get around this 
> issue, see (http://sourceware.org/binutils/docs/ld/Options.html#Options)
> 
> Question is then: Can I direct CMake to enclose static libraries on the 
> command line of LD with --start-group/--end-group?

Flags can be passed to target_link_libraries too:

   add_library(A STATIC a.c)
   add_library(B STATIC b.c)
   add_executable(main main.c)
   target_link_libraries(main -Wl,--start-group A B -Wl,--end-group)

CMake 2.6 also supports circular dependencies for static libraries:

   add_library(A STATIC a.c)
   add_library(B STATIC b.c)
   target_link_libraries(A B)
   target_link_libraries(B A)
   add_executable(main main.c)
   target_link_libraries(main A)

The link line will contain

  ... -o main libA.a libB.a libA.a libB.a

This works in most cases, although it is possible to construct
pathological dependencies that require more than one repeat.  In that
case you can repeat "A B A B A B" in the target_link_libraries command
and CMake will honor it.  However, if the archives are really that
inter-dependent then IMO they should be just one archive.

-Brad


More information about the CMake mailing list