CMAKE_LINK_GROUP_USING_FEATURE.txt 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. It must contain two elements.
  2. ::
  3. <PREFIX> <SUFFIX>
  4. ``<PREFIX>`` and ``<SUFFIX>`` will be used to encapsulate the list of
  5. libraries.
  6. For the elements of this variable, the ``LINKER:`` prefix can be used:
  7. .. include:: ../command/LINK_OPTIONS_LINKER.txt
  8. :start-line: 3
  9. Examples
  10. ^^^^^^^^
  11. Solving cross-references between two static libraries
  12. """""""""""""""""""""""""""""""""""""""""""""""""""""
  13. A common need is the capability to search repeatedly in a group of static
  14. libraries until no new undefined references are created. This capability is
  15. offered by different environments but with a specific syntax:
  16. .. code-block:: cmake
  17. set(CMAKE_C_LINK_GROUP_USING_cross_refs_SUPPORTED TRUE)
  18. if(CMAKE_C_COMPILER_ID STREQUAL "GNU"
  19. AND CMAKE_SYSTEM_NAME STREQUAL "Linux")
  20. set(CMAKE_C_LINK_GROUP_USING_cross_refs "LINKER:--start-group"
  21. "LINKER:--end-group")
  22. elseif(CMAKE_C_COMPILER_ID STREQUAL "SunPro"
  23. AND CMAKE_SYSTEM_NAME STREQUAL "SunOS")
  24. set(CMAKE_C_LINK_GROUP_USING_cross_refs "LINKER:-z,rescan-start"
  25. "LINKER:-z,rescan-end")
  26. else()
  27. # feature not yet supported for the other environments
  28. set(CMAKE_C_LINK_GROUP_USING_cross_refs_SUPPORTED FALSE)
  29. endif()
  30. add_library(lib1 STATIC ...)
  31. add_library(lib3 SHARED ...)
  32. if(CMAKE_C_LINK_GROUP_USING_cross_refs_SUPPORTED)
  33. target_link_libraries(lib3 PRIVATE "$<LINK_GROUP:cross_refs,lib1,external>")
  34. else()
  35. target_link_libraries(lib3 PRIVATE lib1 external)
  36. endif()
  37. CMake will generate the following link expressions:
  38. * ``GNU``: ``-Wl,--start-group /path/to/lib1.a -lexternal -Wl,--end-group``
  39. * ``SunPro``: ``-Wl,-z,rescan-start /path/to/lib1.a -lexternal -Wl,-z,rescan-end``