Question

Il semble que toute ma vie adulte, j'ai été tourmentée par le linker VC ++ se plaignant ou échangeant parce que diverses bibliothèques ne sont pas d'accord sur la version de la bibliothèque d'exécution à utiliser. Je ne suis jamais d'humeur à maîtriser ce sujet lugubre. J'essaie donc de jouer avec ça jusqu'à ce que cela fonctionne. Les messages d'erreur ne sont jamais utiles. La documentation Microsoft n'est pas non plus sur le sujet - pas du moins pour moi.

Parfois, il ne trouve pas de fonctions - parce que le nom de nom n'est pas ce qui était attendu? Parfois, il refuse de se mélanger et de s'approvisionner. D'autres fois, ça dit, "Lien: avertissement LNK4098: DefaultLib 'libcmtd' confronte avec l'utilisation d'autres libs; use / nodefaultlib: bibliothèque" L'utilisation / NodeFaultLib ne fonctionne pas, mais l'avertissement semble être bénin. Qu'est-ce que le diable est "defaultlib" de toute façon? Comment le linker décide-t-il? Je n'ai jamais vu un moyen de spécifier au linker quelle bibliothèque d'exécution à utiliser, seulement comment indiquer au compilateur quelle bibliothèque pour créer des appels de fonction.

Il existe des programmes "Dependency Walker" qui peuvent inspecter les fichiers d'objets pour voir sur les DLL qu'ils dépendent. J'en ai juste couru sur un projet que j'essaie de construire, et c'est un vrai gâchis. Il existe un système .Libs et .dll qui veulent des versions d'exécution contradictoires. Par exemple, comctl32.dll veut msvcrt.dll, mais je lie avec msvcrtd.dll. Je cherche à voir s'il y a un comctl32d.dll, même si je tape.

Je suppose donc que ce que je demande, c'est un tutoriel sur la façon de trier ces choses. Que faites-vous et comment faites-vous?

Voici ce que je pense que je sais. Veuillez me corriger si tout cela est faux.

  1. Les paramètres sont de débogage / libération, multithread / monomoder et statique / dll. Seules six des huit combinaisons possibles sont couvertes. Il n'y a pas de DLL unique, de débogage ou de libération.

  2. Les paramètres affectent uniquement la bibliothèque d'exécution est liée (et la convention d'appel pour le lier). Vous n'avez pas, par exemple, à utiliser un runtime basé sur la DLL si vous construisez une DLL, et vous n'avez pas à utiliser une version de débogage de l'exécution lors de la création de la version de débogage d'un programme, bien qu'elle semble aider lorsque passer devant les appels système.

Question bonus: comment quelqu'un ou une entreprise pourrait-il créer un tel gâchis?

Était-ce utile?

La solution

Cela semble un peu comme essayer de trouver une réponse à la mauvaise question et / ou de réinventer la roue.PHP fera votre vérification pour vous lorsqu'il jette une erreur fatale.

Si vous voulez regarder de cette façon, votre code fonctionne déjà.Vous obtenez une erreur fatale, la classe mère n'existe donc pas, par conséquent, vous devez corriger votre code.Après avoir établi qu'une classe mère est manquante, qu'est-ce que vous allez faire d'autre?Vous avez toujours besoin de le réparer.

Qu'est-ce que j'essaie de dire, c'est que si vous avez réussi à vous débarrasser de l'erreur fatale, cela ne vous permet pas de vous rendre n'importe où - votre code est toujours défectueux et susceptible de planter quelque part en bas de la ligne.Bien sûr, vous pourriez echo 'Vous avez un problème »à l'utilisateur, mais c'est ce que PHP fait déjà.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top