PDA

Visualizza la versione completa : [C++] Consigli pratici su dipendenze e API


Alpha!
21-02-2011, 04:06
Buondì,

è da 1 mese che mi sono messo seriamente sul C++ e avrei alcune domande a problemi in cui mi sono imbattuto.

1) Tempo fa ho notato che in VirusTotal, nella sezione "Imports" si poteva vedere tutte le chiamate alle API ed alla dipendenza msvcrt.dll.
Sfogliandomi le opzioni di DevC++ (4.9.9.2) ho notato l'opzione "Project->Project options->Compiler->Linker->Do not use standard system startup files or libraries" che mi ha permesso di rimuovere quella schifezza e farmi avere un codice moolto più leggero (da 400 a 72kb...).

Per i primi piccoli problemi mi sono auto arrangiato usando Google ma ora il problema pare diverso perchè non riesco ad usare fstream nonostante ho googlato.
Gli errori che mi da l'ide sono:

[Linker error] undefined reference to `std::string::size() const'
[Linker error] undefined reference to `std::string::operator[](unsigned int) const'
[Linker error] undefined reference to `std::string::operator[](unsigned int) const'
[Linker error] undefined reference to `std::string::operator[](unsigned int) const'
[Linker error] undefined reference to `__gxx_personality_sj0'
[Linker error] undefined reference to `_Unwind_SjLj_Register'
e altri tipo
[Linker error] undefined reference to `std::basic_ofstream<char, std::char_traits<char> >::basic_ofstream(char const*, std::_Ios_Openmode)'


Ho anche provato ad aggiungere libstdc++.a ma gli errori si quadruplicano.
- Qual'è l'errore che sto commettendo?
- C'è un'alternativa per scrivere dentro un file?
- C'è un'alternativa più semplice per compilare senza dipendenze?


2) Siccome le API le chiamo in questo modo:

typedef HANDLE (WINAPI *__OpenMutex)
(
DWORD dwDesiredAccess,
BOOL bInheritHandle,
LPCTSTR lpName
);
__OpenMutex _OpenMutex = (__OpenMutex)GetProcAddress(GetModuleHandle("kernel32.dll"), "OpenMutexA");

Su MSDN ho visto che GetForegroundWindow() è strutturata così:

HWND WINAPI GetForegroundWindow(void);

percui pensavo che questo modo fosse corretto:

typedef HWND (WINAPI *__GetForegroundWindow)
(
void
);
__GetForegroundWindow_GetForegroundWindow= (__GetForegroundWindow)GetProcAddress(GetModuleHan dle("user32.dll"), "GetForegroundWindow");

ma purtroppo mi fa crashare l'applicazione non appena la uso. Idee a proposito?


Ringrazio già in anticipo!
Buona notte :P

lolide
21-02-2011, 09:38
400KB sono una dimensione giusta per gli eseguibili.
Meno non riesci ad ottenerli.
Le librerie C++ le devi includere per forza, quindi non puoi evitare di non includerle.

Alpha!
21-02-2011, 14:11
Originariamente inviato da lolide
400KB sono una dimensione giusta per gli eseguibili.
Meno non riesci ad ottenerli.
Le librerie C++ le devi includere per forza, quindi non puoi evitare di non includerle.
Grazie!
Ma il mio problema sta in quella dannata dipendenza che io non voglio. Any idea?

MItaly
21-02-2011, 14:32
Ma perché non vuoi quella dipendenza? MinGW genera eseguibili che dipendono dalla CRT presente in tutte le versioni di Windows, non ti devi preoccupare di doverla fornire tu.
L'alternativa (che non so se è disponibile con MinGW) è il linking statico con la CRT, che però fa aumentare le dimensioni dell'eseguibile.
Tra l'altro trovo strano che ti venga un eseguibile così grosso, hai compilato in modalità release (ottimizzazioni attive e simboli di debug non inclusi nell'eseguibile generato)?

lolide
21-02-2011, 14:37
Purtroppo non hai molta scelta.
Compilando con MinGW, include tutte le dipendenze con librerie statiche, quindi l'eseguibile viene + grosso, ma non include cose inutili.
Se fai progetto Win32, lui include le lib standard del C, ed altre librerie windows tipo kernel32.lib, user32.lib ecc... che non puoi rimuovere.

Usando Visual C++ invece, gli eseguibili verranno leggeri, ma perchè alcune funzioni le lascia da linkare con DLL di Visual C++ (le famose redistributable).

Quindi devi tenerlo così, a meno che non trovi le librerie standard del C++ e te le includi tutte man mano (cerca nella cartella di DevC++, sinceramente non ho mai tentato di farlo :))

MItaly
21-02-2011, 16:18
Originariamente inviato da lolide
Purtroppo non hai molta scelta.
Compilando con MinGW, include tutte le dipendenze con librerie statiche, quindi l'eseguibile viene + grosso, ma non include cose inutili.
Non mi risulta. Da quanto ricordo, di base MinGW usa la CRT standard Microsoft con linking dinamico (quella fornita dal sistema operativo nonché CRT di default usata per VC++6), aggiungendo solo le features che le mancano tramite linking statico.

Alpha!
21-02-2011, 19:09
Originariamente inviato da lolide
Purtroppo non hai molta scelta.
Compilando con MinGW, include tutte le dipendenze con librerie statiche, quindi l'eseguibile viene + grosso, ma non include cose inutili.
Se fai progetto Win32, lui include le lib standard del C, ed altre librerie windows tipo kernel32.lib, user32.lib ecc... che non puoi rimuovere.

Usando Visual C++ invece, gli eseguibili verranno leggeri, ma perchè alcune funzioni le lascia da linkare con DLL di Visual C++ (le famose redistributable).

Quindi devi tenerlo così, a meno che non trovi le librerie standard del C++ e te le includi tutte man mano (cerca nella cartella di DevC++, sinceramente non ho mai tentato di farlo :))
le librerie ci sono, se leggi il problema se non erro avevo accennato che avevo ne avevo usato una che però mi da errore

lolide
21-02-2011, 19:19
Originariamente inviato da Alpha!
le librerie ci sono, se leggi il problema se non erro avevo accennato che avevo ne avevo usato una che però mi da errore

Quell'errore significa che il linker non riesce a risolvere la reference a quella classe, quindi: non includi la libreria giusta.

E a quello che ho constatato, non esiste una reference su mingw e su come implementa le varie librerie.

linoma
21-02-2011, 19:22
Intanto usa CodeBlocks invece di devcpp. A me un file viene circa 270 kb.

Alpha!
21-02-2011, 20:45
Originariamente inviato da linoma
Intanto usa CodeBlocks invece di devcpp. A me un file viene circa 270 kb.
Il mio problema non è il peso, ma che voglio avere un progetto pulito.

Loading