Quel est l’équivalent Microsoft Visual Studio de l’option GCC ld –whole-archive

Lorsque vous liez une bibliothèque statique à un exécutable, les symboles non référencés sont normalement ignorés. Dans mon cas, certains objects inutilisés sont utilisés pour enregistrer leurs classes respectives dans une fabrique et si les objects sont supprimés, cet enregistrement échoue.

Sous Unix où nous utilisons gcc, je peux passer le drapeau –whole-archive à l’éditeur de liens ld (voir l’extrait de la documentation de ld ci-dessous), ce qui fait que ld ne supprime aucun object. Existe-t-il quelque chose comme ceci pour Visual C ++?

–whole-archive

Pour chaque archive mentionnée sur la ligne de commande après le
Option `whole-archive ‘, inclure chaque fichier object dans l’archive
dans le lien, plutôt que de chercher dans les archives pour la
fichiers d’object. Ceci est normalement utilisé pour transformer un fichier d’archive en
une bibliothèque partagée, forçant chaque object à être inclus dans le
bibliothèque partagée résultante. Cette option peut être utilisée plus d’une fois.

    À ma connaissance, il n’existe pas d’option unique permettant de le garantir de manière fiable. Il existe des combinaisons d’options d’optimisation qui désactivent (de manière silencieuse) cette option, donc aucun moyen … /INCLUDE fonctionne, mais vous devez pour cela extraire et coder en dur le nom mutilé du symbole. Vous avez le choix entre deux possibilités: (1) vous assurer que tous les bureaux d’enregistrement sont contenus (inclus) dans l’unité de traduction contenant main et appliquer leur utilisation. (2) Abandonnez cet “idiome” et utilisez un enregistrement explicite.

    Attention: cette réponse a maintenant presque 7 ans et les déclarations concernant la disponibilité des options dans la chaîne d’outils MSVC ++ sont obsolètes. Néanmoins, je recommande quand même de ne pas compter sur le modèle de registraire et d’examiner les alternatives. N’hésitez pas à voter à la baisse à cause de cette recommandation, mais je suppose que c’est un peu injuste de voter à la baisse, car l’option a été ajoutée à l’éditeur de liens Microsoft entre-temps.

    La version de Visual C ++ dans Visual Studio 2015 Update 2 inclut un nouvel indicateur de link.exe appelé /WHOLEARCHIVE , qui a une fonctionnalité équivalente à l’option --whole-archive de ld . Selon la documentation du drapeau :

    L’option /WHOLEARCHIVE oblige l’éditeur de liens à inclure tous les fichiers d’objects de la bibliothèque statique spécifiée ou, si aucune bibliothèque n’est spécifiée, de toutes les bibliothèques statiques spécifiées dans la commande LINK.

    Je pense que l’équivalent le plus proche serait /OPT:NOREF .

    J’utilise / INCLUDE: pour forcer l’inclusion de symboles non utilisés.

    Vous pouvez utiliser avec CMake comme:

     add_executable(hello ${SOURCE_FILES}) target_link_libraries(hello libA libB libC) # Not need /wholearchive libC set_target_properties(hello PROPERTIES LINK_FLAGS "/WHOLEARCHIVE:libA /WHOLEARCHIVE:libB") 

    Remarque: /WHOLEARCHIVE uniquement disponible Visual Studio 2015 Update 2+

    J’ai utilisé une autre approche – plutôt que de tout comstackr dans un .lib , puis de le lier à l’exécutable, je .obj directement aux fichiers .obj .

    Dans CMake, cela peut être fait comme ceci:

     add_library(common OBJECT ${common_sources}) add_executable(executable1 "main1.cc" $ add_executable(executable2 "main2.cc" $ 

    Changer l’un des fichiers dans ${common_sources}) ne fait que recomstackr leurs objects équivalents et relier les exécutables, ce qui offre les mêmes avantages que si vous aviez lié des éléments via .lib intermédiaire. Dans le même temps, tous les constructeurs statiques restnt en place, ce qui résout le problème.

    Notez que cela n’est utile que si vous liez des choses de manière statique.

    Cette approche a été testée avec gcc 5.2.0, MinGW-w64 5.2.0 et MSVC 15.

    Dans la page de propriétés de l’exécutable, voir Propriétés communes / Références / Utiliser les entrées de dépendance de bibliothèque, définissez-le sur true. C’est à peu près l’équivalent MS de –whole-archive en un mot.

    Edit: Cependant, la bibliothèque en question doit faire partie de la solution.