11
votes

Spécification des drapeaux de liaison pour une seule liberme statique lors de la liaison exécutable

J'ai une exécutable construite à partir de plusieurs fichiers d'objets et liés à plusieurs bibliothèques statiques et partagées. Je tiens à spécifier -WL, -WL, -WL, option de liaison d'archives à l'une des bibliothèques liées.

Par exemple, à partir de cette commande: p> xxx pré>

Je veux obtenir cette commande : P>

set_target_properties(myExec PROPERTIES LINK_FLAGS "-Wl,-whole-archive")


0 commentaires

3 Réponses :



3
votes
TARGET_LINK_LIBRARIES(myTarget -Wl,--whole-archive myLib -Wl,--no-whole-archive)
Simply replace myTarget and myLibOryginal post: https://stackoverflow.com/a/37564428/1052261

0 commentaires

0
votes

Comme @Richvonlehe souligne, la solution proposée peut ne pas fonctionner si vous avez plusieurs bibliothèques. CUMAKE Treats -WL, - Archive entier My_Particulôt_lib -WL, - Non-Toute Archive Code> comme 3 bibliothèques distinctes, et ne fait aucune garantie sur la commande. Dans mon cas particulier, j'ai constaté que j'ai fini par avoir un groupe d'autres archives qui sont incluses entre le -WL, - une archive globale code> et -WL, - non-total-archive CODE> Drapeaux, entraînant des définitions de symboles en double.

Malheureusement, vous aussi em> peut ne pas être en mesure de tout emballer dans des guillemets. Si vous faites -WL, - Archive entière, $ , - NO-WORL-ARCHIVE CODE> ou similaire, vous trouverez que CMAKE arrête de traiter my_particult_lib em > En tant que cible symbolique et plutôt, traite simplement la chaîne entière en tant que drapeau de lien. Si my_particulaire_lib em> se trouve avoir d'autres effets secondaires CMAKE, tels que cible_include_directies () em> ou dans mon cas, ils cesseront d'être inclus. P> En fin de compte, je devais recourir à une couche d'indirection. L'astuce consiste à utiliser une bibliothèque d'interface comme une chose de niveau supérieure. Utilisez une bibliothèque ( my_lib_part_1 em>) pour pendre toutes les propriétés que je devais être héritées de manière transitoire par d'autres cibles, telles que des en-têtes publics et une autre bibliothèque ( my_lib_part_2 em>) qui a catégoriquement n'est pas strong> de propriétés qui devaient être héritées et ne fournissent que les archives .a. P>

même cela fait défaut. Cmake rend difficile d'avoir des bibliothèques statiques vides et ne vous permet pas de mettre en-têtes publics sur des bibliothèques d'interface (encore?). P>

add_library(my_lib INTERFACE)

add_library(my_lib_part_1 STATIC
  foo.cpp
  )

add_library(my_lib_part_2 STATIC
  bar.cpp
  )

target_link_libraries(my_lib
  INTERFACE
    my_lib_part_1
    # It is very important this is in quotes so CMake treats it as a single flag
    "-Wl,--whole-archive $<TARGET_FILE:my_lib_part_2> -Wl,--no-whole-archive"
   )

set_target_properties(my_lib_part_1 PROPERTIES
  PUBLIC_HEADER "my_public_header.hpp"
  )


set_target_properties(my_lib_part_2 PROPERTIES
  POSITION_INDEPENDENT_CODE ON
  )


0 commentaires