Utilisation de Visual Studio 2008 et son compilateur C / C ++, comment créer une DLL Win32 dépend uniquement des autres dlls Windows et n'a aucune dépendance à l'exécution de Microsoft C? P>
J'ai du code C, je veux placer dans une DLL entièrement calculé et ne fait presque aucune utilisation des fonctions de la bibliothèque C. p>
Pour ceux qu'il utilise (par exemple, MEMCY), je suis heureux de retravailler le code pour utiliser les équivalents d'API Win32 (par exemple, la copymémorie). P>
7 Réponses :
Certaines bibliothèques de Windows dépendent de l'exécution C (ODBC32.DLL, par exemple) Je pense donc que vous êtes sur une cachette de rien ici. Pourquoi voudriez-vous faire cela, de toute façon? P>
Je pense que son juste suppose que toutes les dépendances des DLL Windows viendront avec Windows. Je ne vois pas ton point.
Si votre code dépend d'une DLL comme ODBC32, cela dépend indirectement du CRT, qui est livré avec Windows - êtes-vous sous l'impression erronée qu'il doit être distribué séparément? Et si vous avez baissé cette réponse, je dois demander - pourquoi?
Si je construis mon code avec le compilateur Microsoft C, je dois utiliser l'exécution C fournie avec elle, si je veux le comportement qu'ils documentent / suport. Cela nécessite une distribution dudit runtime avec mon code. Je suppose que je pouvais "découvrir" un autre runtime C renversant sous Windows et en quelque sorte un lien de manière dynamique, mais c'est plutôt plus de travail que dans l'esprit, surtout quand je n'ai besoin d'aucune de ses fonctions ...
Vous n'avez pas besoin de distribuer le temps d'exécution C avec votre application, et vous n'avez pas besoin de "découvrir" un autre C Runtimne - vous utilisez simplement celui que toutes les autres applications Windows utilisent. J'ai un projet FOSS qui est un seul exécutable Windows, pas d'exécution distribuée avec elle de tout type.
droit. Mais quelle version? VC ajoute une version particulière de MSVCRT au manifeste de la DLL qu'elle produit. Si Windows ne trouve pas cette version exacte i> il ne chargera pas la DLL. Expédiez-vous sans manifestations? Ou abaissez-vous la version requise dans le manifeste?
Suivi après la lecture: Stackoverflow.com/questions/135296/... La réponse de la personne qui prétendant être de la SM rend les choses claires. Si je veux utiliser la langue C / C ++ en VC 2008, j'ai besoin de réducteur que MSVCRT. Si je ne veux pas faire cela, je peux soit faire comme vous proposez, puis d'obtenir une sorte d'interfonctionnement bizarre des hypothèses linguistiques de VC2008 et de certaines anciennes MSVCRT, ou je peux supprimer l'ambiguïté en ne reliant pas du tout à MSVCRT (que le compilateur nettement les soutiens). Je pourrais bien imaginer que le lien avec l'ancien aura-t-il "travailler surtout".
Compilez-le avec Statique Microsoft Lib. P>
Comme indiqué ici: msdn.microsoft.com/en-us /Library/abx4dbyhh(vs.80).aspx Un exécution Microsoft C moderne n'est préférable pas de manière statique à une DLL dans un système dans lequel d'autres bibliothèques peuvent utiliser le temps d'exécution C.
Utilisez l'option / NodeFaultLib Linker et (bien sûr) Assurez-vous de ne pas avoir aucune dépendance réelle sur le temps d'exécution. Vous devrez également spécifier et définir votre propre point d'entrée pour la DLL à l'aide de l'option / Entry Cadminer ou de disposer de votre propre fonction de point de saisie correspondant au nom attendu par le compilateur / linker (pour une DLL, c'est L'article de Matt Pietrek de Way Retour lors de la libctie aura probablement toutes les informations dont vous avez besoin: P>
_dllmaincrtstartup code> ). p>
Pour citer cet article "Heureusement, nous avons passé ces jours-ci et, dans la plupart des cas, vous pouvez compter sur MSVCRT.DLL étant disponible sur vos machines cible." Et Pietrek suggère que vous devriez alors dépendre.
Et est-ce toujours vrai i>? Les lots ont changé depuis les jours de Windows 2000. Je pense que maintenant ce n'est pas le cas que nous devrions dépendre de MSVCRT sur la machine. Au moins, il est plus compliqué que l'instruction de Matt indique.
Nous pouvons dépendre de msvcrt.dll étant sur la machine, mais des liens Visual C ++ contre MSVcrver.dll où VER est 80, 90, 100, 110, etc.
Vous devez vous assurer que aucune des dlls Win32 que vous n'utilisez besoin de l'exécution C aussi ou d'autre que vous revenez à la case Square One. La compilation de votre DLL ne comptera pas que si l'une des DLL Win32 dépend de l'exécution C. p>
La seule façon dont je peux voir que ce fonctionnement est de relier statiquement toutes vos DLL à charge (si cela est même réalisable) dans votre DLL. Cela signifie bien sûr que vous devriez recompiler pour profiter de toutes les mises à jour de la DLL. P>
Vous pouvez avoir plus de dépendances sur le CRT que vous ne le pensez. Il déchire des ressources telles que le stockage local du fil et les initialisateurs de classe mondiale sont gérés par le CRT avant la principale (). P>
envisager de relier avec un CRT statique, comme l'a dit quelqu'un, et si vous ne voulez vraiment pas vraiment, utiliser / nodefaultlib et / inscription comme quelqu'un d'autre dit. P>
Oh, et au lieu de retravailler MEMCY, envisagez d'utiliser le Super-Fast COMPILER intrinsèque pour cela. Vous pouvez activer intrinsèque avec / oi. P>
J'utilise MEMCY comme exemple uniquement.
C'est une bonne idée, mais documente-t-ils que les intrinsics du compilateur ne dépendent pas de l'existence de leur propre runtime? Je suppose que je pouvais examiner la sortie du compilateur pour être sûr, mais c'est plus de travail que ce que j'avais en tête ...
Les intrinsions sont toutes l'assemblage générées par la main par le compilateur. Cependant, lors de la relecture de la documentation, il ne garantit pas que le compilateur utilisera la intrinsèque si vous le dites. Par exemple, il pourrait peut-être utiliser l'intrinsèque uniquement pour Strcpy sous ou sur une certaine taille, en raison des caractéristiques de performance différentes.
Le drapeau Ce que vous voulez est l'option / NODEFAULLIB CODE> NODEFAULLIB n'est pas réellement le drapeau approprié. Il ignorera Toutes les libs par défaut forts>, y compris d'autres comme
uuid.lib code>. P>
/ zl code> compilateur, "omettre le nom de la bibliothèque par défaut dans .obj". P>
pour le mode "débogage" Essayez ceci: p>
pour le mode "Release", faites les mêmes étapes, sauf que la sélection de Ceci provoque une fonction d'exécution C d'exécution C utilisée dans votre programme pour être liée statiquement à votre fichier binaire. P>
Celui-là a travaillé pour moi. Je ne voulais pas supprimer la dépendance à MSVCRT, mais plutôt "limiter" les dépendances supplémentaires qui auraient pu provoquer l'erreur "dépendance manquante".
CopyMemory n'est pas une fonction Winapi, vous devrez écrire votre propre
Désolé de cogner un vieux fil, mais
CopyMemory code> est une fonction API: msdn.microsoft.com/en-us/library/aa366535%28vs.85%29.aspx sauf, c'est
#define code> d pour appeler < Code> MemcPy code> à la place.