Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1
    Utente di HTML.it L'avatar di Alpha!
    Registrato dal
    May 2005
    Messaggi
    68

    [C++] Consigli pratici su dipendenze e API

    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:
    codice:
      [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:
    codice:
    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ì:
    codice:
    HWND WINAPI GetForegroundWindow(void);
    percui pensavo che questo modo fosse corretto:
    codice:
    typedef HWND (WINAPI *__GetForegroundWindow)
    (
    	void
    );
    __GetForegroundWindow_GetForegroundWindow= (__GetForegroundWindow)GetProcAddress(GetModuleHandle("user32.dll"), "GetForegroundWindow");
    ma purtroppo mi fa crashare l'applicazione non appena la uso. Idee a proposito?


    Ringrazio già in anticipo!
    Buona notte :P

  2. #2
    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.
    lolide
    Java Programmer

    Informati

  3. #3
    Utente di HTML.it L'avatar di Alpha!
    Registrato dal
    May 2005
    Messaggi
    68
    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?

  4. #4
    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)?
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    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 )
    lolide
    Java Programmer

    Informati

  6. #6
    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.
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    Utente di HTML.it L'avatar di Alpha!
    Registrato dal
    May 2005
    Messaggi
    68
    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

  8. #8
    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.
    lolide
    Java Programmer

    Informati

  9. #9
    Utente di HTML.it L'avatar di linoma
    Registrato dal
    Mar 2010
    Messaggi
    1,346
    Intanto usa CodeBlocks invece di devcpp. A me un file viene circa 270 kb.
    Per gli Spartani e Sparta usa spartan Il mio github

  10. #10
    Utente di HTML.it L'avatar di Alpha!
    Registrato dal
    May 2005
    Messaggi
    68
    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.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.