[MinGW] Virer les dependances au CRT

Résolu
Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 - 11 août 2007 à 15:30
Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 - 15 août 2007 à 11:59
Bonjour,
Est-ce que quelqu'un saurait comment virer les depences au crt ds une dll?
Je ne les utilises pas, mais j'ai quand mm des apelles a malloc, free, fprintf, fflush, abort, _iob, _errno, __dllonexit
Surement a cause du point d'entré que le linker redefini a DllMainCRTStartup, j'ai essayer ca:
--entry=DllMain
--nostdlibs
-lkernel32
-lntdll
mais a la compilation je me retrouve avec cette erreur:[Warning] cannot find entry symbol DllMain; defaulting to 65581000
J'ai aussi essayer de refaire la fonction DllMainCRTStartup:
int APIENTRY DllMainCRTStartup(void)
{
return 1;
}
mais elle semble etre ignoré
Si quelqu'un a une solution...

Neo_Fr

39 réponses

Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 2
11 août 2007 à 23:57
Petit exemple:
HANDLE hInFile = CreateFile(InFile, GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0);
error C2275: 'HANDLE' : utilisation non conforme de ce type comme expression
DWORD pBuff = 0;
error C2275: 'DWORD' : utilisation non conforme de ce type comme expression
Sans parler des warning a tout va

Pouquoi c'est impossible d'initialiser la variable directement a la declaration?
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
12 août 2007 à 00:01
Parce que tu compiles en C (certainement) donc rien que du normal vu qu'il y a d'autres variables pas encore déclarées dessous.

Tu peux par contre initialiser avec une constante (0, 254, etc...).
Pourquoi ? bonne question, je te laisse tenter une réponse.

ciao...
BruNews, MVP VC++
0
Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 2
12 août 2007 à 00:07
Oui je compile en c
Quel est la difference entre:
HANDLE hFile;
hFile = CreateFile(...);

et:

HANDLE hFile = CreateFile(...);

aucune?

alors pk l'un compile et pas l'autre?

"Tu peux par contre initialiser avec une constante (0, 254, etc...)."

DWORD dwmachin = 0;
ca me sort kan mm une erreur
error C2275: 'DWORD' : utilisation non conforme de ce type comme expression
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
12 août 2007 à 00:09
HANDLE hFile = (HANDLE) -1;
DWORD dwmachin = 0;

devrait passer.

ciao...
BruNews, MVP VC++
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 2
12 août 2007 à 00:14
et en quoi ce code est-il incorect?:
BYTE md5Key[32];
error C2275: 'BYTE' : utilisation non conforme de ce type comme expression
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
12 août 2007 à 00:15
Totalement valide, erreur viendra de ce qui suit ou précède.

ciao...
BruNews, MVP VC++
0
Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 2
12 août 2007 à 00:27
Bon si vraiment je ne trouve aucune solution a mon pb, pour une fois j'utiliserait VC mais bon sa va m'obliger a revoir tt mon code, a mettre tt les declarations de variables tt en haut des fonctions, etc...

Domage que vc soit pa un peut plus souple...
0
NairodDorian Messages postés 130 Date d'inscription lundi 26 juin 2006 Statut Membre Dernière intervention 18 août 2008
12 août 2007 à 10:04
Ecrire du code en C ca a toujours ete :

fonction(param1, ..., paramN) // correspond a int fonction(...)
{
variable1, ..., variableN;

variable1 = 1 + 1;
variableN = variable1 + 5;

code...
} // retourn int par defaut

C'est a partir de la norme C99 que tu peux declarer tes variables comme en C++

int fonction(param1, ..., paramN) // obligation de declarer int fonction(...)
{
variable1;

variable 1 = 1 + 1;

variableN = variable1 + 5;

code...
}
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
12 août 2007 à 11:47
Pour le problème de départ (définition multiple de DllMainCRTStartup@12), il suffit d'ajouter l'option -nostdlib à la ligne de commande. Source : Contourner l'utilisation de la CRT avec MinGW (hack GCC)

_____________________________________
Un éditeur de ressources gratuit pour Windows
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
12 août 2007 à 11:50
[auteurdetail.aspx?ID=809093 NairodDorian]> C99 permet de déclarer des variables au milieu d'un bloc d'instructions comme en C++, mais le typage des fonctions existait déja avant C99

_____________________________________
Un éditeur de ressources gratuit pour Windows
0
Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 2
12 août 2007 à 13:19
Merci pour le lien mais ca ne marche tjrs pas :(
Je compile a travers devcpp ds linker je lui met ca:

--nostdlib
--allow-multiple-definition
-lntdll
-lkernel32
--no-export-all-symbol
Mais --allow-multiple-definition n'as pas l'air de fonctionner car il me met tjrs :

multiple definition of `DllMainCRTStartup@12'
first defined here
ld returned 1 exit status

Je ne sais plus quoi essayer...
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
12 août 2007 à 13:23
Faut pas mettre --allow-multiple-definition

_____________________________________
Un éditeur de ressources gratuit pour Windows
0
Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 2
12 août 2007 à 13:26
Meme sans ca me donne tjrs la meme erreur.
0
Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 2
12 août 2007 à 14:20
Je vient de tester et effectivement ca marche, je pensse que c'est du au fait que devcpp link avec ld et non pas avec g++
g++ c'est pas le compilateur cpp?
0
NairodDorian Messages postés 130 Date d'inscription lundi 26 juin 2006 Statut Membre Dernière intervention 18 août 2008
12 août 2007 à 14:24
gcc = compilateur exclusivement C
g++ = compilateur C++
0
Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 2
12 août 2007 à 14:34
C bien ce que je penssait...
Est-ce vraiment bien de linker une dll C avec un compilo cpp?
0
Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 2
12 août 2007 à 14:40
C deja mieux :D
Merci de ton aide ca marche

Domage quand meme de compiler avec devcpp et d'etre obligé de linker a la main..
0
katsankat Messages postés 571 Date d'inscription vendredi 30 décembre 2005 Statut Membre Dernière intervention 12 juillet 2012 3
15 août 2007 à 00:19
Dans menu Projet/Options du Projet/Compilateur/Edition de liens
 "ne pas utiliser les libs standards" mettre yes (c'est -nostdlib)
 "retirer symboles de l' exéctuable" mettre yes (c'est -s ou --no-export-all-symbols)
Dans paramètres/éditeur de lien ajouter les libs à linker:
   -luser32
   -lkernel32
   -lcomctl32
  (-mwindows et --add-stdcall-alias sont facultatifs)
Ya plus qu'à cliquer sur le bouton compiler.
0
Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 2
15 août 2007 à 11:59
comctl32 et user32 ds une dll?
Les deux seul lib dont ma dll a besoin c'est ntdll et kernel32 et avec devcpp ca m'ajoute msvcrt seul solution compiler et linker avec gcc ou utiliser msvc
0
Rejoignez-nous