2009-11-01 5 views
2

Je travaille sur la relance d'un ancien projet (qui ne fonctionne qu'avec < 5.1) qui compile PHP 5.3 en un PE C++ EXE. J'ai tout à fait travailler vraiment bien sur plusieurs ordinateurs Windows 7 avec seulement 2 dll et 1 exe pour la plupart des applications! Malheureusement, je reçois XP:C++ EXE fait en VC++ 2008 fonctionne sous Windows 7 mais pas XP

l'application n'a pas pu démarrer car la configuration de l'application est incorrecte

J'ai installé Microsoft Visual C++ 2008 Redistributable Package en vain. J'ai également copié msvcm90.dll, msvcr90.dll, msvcp90.dll dans le même répertoire que l'exe. Cela n'a pas fonctionné non plus. Est-ce que je dois juste compiler le projet sur XP pour qu'il fonctionne sur XP?

Je suis vraiment bon en PHP, mais C n'est pas mon fort, donc je suppose qu'il me manque quelque chose d'évident dans le compilateur.

EDIT: Quand je compile avec juste multithread (/ Mt) Je reçois ceci:

MSVCRT.lib(MSVCR90.dll) : error LNK2005: _fflush already defined in 
LIBCMT.lib(fflush.obj) 
MSVCRT.lib(MSVCR90.dll) : error LNK2005: _malloc already defined in LIBCMT.lib(malloc.obj) 
MSVCRT.lib(MSVCR90.dll) : error LNK2005: _free already defined in LIBCMT.lib(free.obj) 
LINK : warning LNK4098: defaultlib 'MSVCRT' conflicts with use of other libs; use /NODEFAULTLIB:library 
out/console_debug.exe : fatal error LNK1169: one or more multiply defined symbols found 
+1

Lors d'une liaison statique au CRT, vous devez le faire dans tous les projets impliqués dans la solution (ou tous les sous-projets impliqués dans un projet). Si vous jetez un oeil à la sortie de l'éditeur de liens, vous pouvez voir qu'il y a des erreurs de lancer que certaines fonctions sont déjà définies. MSVCRT est utilisé lors de la liaison dynamique, LIBCMT lors de la liaison statique. Assurez-vous de spécifier/MT dans tous les projets/sous-projets. Aussi, lors de la construction de toutes vos propres bibliothèques, vous liez (le cas échéant). – Xandy

+0

Eh bien, je crois que je n'ai qu'un seul fichier cpp un fichier de ressources. Une seule solution et un projet. J'utilise d'autres DLL, mais celles-ci sont requises au moment de l'exécution et ne devraient pas provoquer d'erreurs de construction. –

+0

Ensuite, le problème est avec les DLL. Si vous pouvez les recréer, utilisez le commutateur/MT, si vous ne pouvez pas les recréer (par exemple, ils sont tiers et que vous n'avez pas le code), votre projet ne se construira que lors de la liaison dynamique au CRT (/ MARYLAND). – Xandy

Répondre

3

Essayez d'utiliser Dependency Walker sur XP pour voir si vous pouvez trouver toutes les dépendances manquantes.

Vérifiez également l'Observateur d'événements. Et assurez-vous que vous construisez l'application en mode Release.


Dependency Walker montrant une dépendance à l'égard dwmapi.dll est souvent une déclaration incorrecte, ce qui peut entraîner d'avoir une dépendance à l'égard mshtml.dll sur une boîte de XP avec IE7. Avez-vous vérifié l'Observateur d'événements?

Les erreurs de génération que vous avez signalées suggèrent que vous liez des bibliothèques qui ne sont pas générées avec l'indicateur/MT. Assurez-vous de reconstruire tout dans votre solution; vos deux DLL, le. EXE et toutes les bibliothèques statiques avec ce même drapeau, en supposant que vous possédez également les DLL.

+1

Il me dit qu'il me manque EFSADU.DLL et DWMAPI.DLL. Maintenant, j'ai juste besoin de trouver ceux .... –

+1

Selon http://www.msfn.org/board/missing-dwmapi-dll-and-efsadu-dll-t93950.html ces DLL sont Windows Vista et plus. Il semble que EFSADU.dll n'est pas requis mais DWMAPI.DLL est, donc j'ai besoin de voir ce qui ne va pas. –

+0

J'ai copié DWMAPI.DLL sur \ Windows \ system32 \ sur la machine XP. Cela n'a pas aidé. Le fichier EFSADU.dll ne traite que du chiffrement de fichier, il n'est donc pas nécessaire. Je peux poster mon dwi si nécessaire. –

1

Avez-vous essayé Projet/Propriétés/Propriétés de configuration/C/C++/Génération de code/Bibliothèque d'exécution -> Multi-threaded (/ MT)?

+0

J'ai mis à jour mon premier message pour montrer ce que je reçois quand je fais ça. –

+0

Cela a résolu d'autres problèmes que j'ai eu dans le passé, mais pas cette fois. –

+0

et il n'est pas possible de résoudre ces problèmes? Juste curieux – henle

2

Avez-vous les fichiers manifeste dans le répertoire de votre application? Je recommande de s'assurer qu'ils sont là et se réfèrent correctement aux emplacements DLL. Jetez un oeil à cette référence:

http://msdn.microsoft.com/en-us/library/ms235342(VS.80).aspx

+0

Je ne pense pas en avoir un, devrais-je? –

+0

Si vous construisez votre exécutable pour utiliser les bibliothèques d'exécution en tant que DLL, oui. Même si toutes les DLL sont installées sur la machine cible, votre EXE ne pourra pas les trouver sans le fichier manifeste. Mais une alternative est de lier l'exécution en tant que lib statique, comme suggéré par henle. Bien sûr, votre exécutable va grossir en conséquence. –

0

Essayez d'installer les Redistribuables VC2008 sur la machine XP.

Questions connexes