Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    131

    [C\C++] VC++ 2010, Nessuna dipendenza dalle librerie standard

    Buona sera

    Vorrei compilare un programma senza le librerie standard.
    Setto /NODEFAULTLIB,
    poi inserisco l'entry del programma con /ENTRY.

    Sta di fatto che il compilatore nel mio codice genera comunque chiamate alle funzioni delle librerie e lo vedo dagli errori:
    codice:
    error LNK2001: simbolo esterno __fltused non risolto
    error LNK2001: simbolo esterno __RTC_Shutdown non risolto
    error LNK2001: simbolo esterno __RTC_Shutdown non risolto
    error LNK2001: simbolo esterno __RTC_InitBase non risolto
    error LNK2001: simbolo esterno __RTC_InitBase non risolto
    non ho idea di come evitare quelle chiamate a funzione..
    c'è qualcuno che lo sa?

    grazie a tutti

  2. #2
    non puoi fare una cosa del genere.
    Le librerie di default sono anche librerie come kernel32 user32 eccc.. cioè librerie che servono all'init di un programma e che sono chiamate dal sistema operativo.

    Togliendo le librerie di default è come se creassi una libreria .lib (lib statica) con il formato di un PE.
    Questa non è eseguibile in poche parole

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    131
    scusatemi, mi ero dimenticato di dire che nel progetto ho incluso anche kernel32.lib
    quella che sto facendo è solo una prova il codice è questo..

    codice:
    #include <windows.h>
    
    void start ()
    {
    
    
    	ExitProcess (0);
    }
    e ho settato come entry start

    se non chiamo nessuna funzione contenuta in user32.dll, non posso fare a meno di metterla?

    stano che il compilatore non permetta di creare un pe contenente soltanto la chiamata alla funzione della lib kernel32.dll..

  4. #4
    Originariamente inviato da XAlbeX
    scusatemi, mi ero dimenticato di dire che nel progetto ho incluso anche kernel32.lib
    quella che sto facendo è solo una prova il codice è questo..

    codice:
    #include <windows.h>
    
    void start ()
    {
    
    
    	ExitProcess (0);
    }
    e ho settato come entry start

    se non chiamo nessuna funzione contenuta in user32.dll, non posso fare a meno di metterla?

    stano che il compilatore non permetta di creare un pe contenente soltanto la chiamata alla funzione della lib kernel32.dll..
    Prova a includere winbase.h
    Forse windows.h definisce anche altre funzioni che non sono contenute in kernel32.lib

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    131
    mi da errori di tutti i colori nel header winbase.h, per il fatto che mancano le definizioni dei tipi di windows, includendo anche windef.h rimangono comunque altri errori..

    in teoria non dovrebbe dare fastidio al compilatore se metti prototipi che non trova poi nelle librerie (a meno che tu non chiedi di chiamarle)..

    bisognerebbe sapere che funzione è la __RTC_InitBase..

  6. #6
    Originariamente inviato da XAlbeX
    in teoria non dovrebbe dare fastidio al compilatore se metti prototipi che non trova poi nelle librerie (a meno che tu non chiedi di chiamarle)..
    No invece da proprio errore per quello, se sono definiti i prototipi dev'essere definita la funzione.
    Tu includendo kernel32.lib includi la libreria di ExitProcess() ma windows.h definisce altre funzioni. Devi includere anche le librerie dove sono definite le funzioni che ti chiede.

    Purtroppo sono limitazioni del compilatore Visual C, se usi quello i programmi sono per SO microsoft

    Puoi provare a togliere la dipendenza dal Common Language Runtime nelle opzioni progetto, C/C++, generale e setta in opzioni progetto, Generale, Uso MFC a Usa MFC in una libreria statica

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    131
    ho provato.. mi da esattamente gli stesi errori..

    ma la funzione __RTC_InitBase è contenuta in una dll di windows? ad occhio sembra una funzione che inizializza la libreria standard e il processo..

    ho incluso tutte queste librerie
    kernel32.lib
    user32.lib
    gdi32.lib
    winspool.lib
    comdlg32.lib
    advapi32.lib
    shell32.lib
    ole32.lib
    oleaut32.lib
    uuid.lib
    odbc32.lib
    odbccp32.lib

    ma vengono fuori sempre gli stessi errori..

    Da quel che mi ricordo se fai un applicazione in assembly per Win32 non hai bisogno di inizializzare niente.. il compilatore cosa deve inizializzare? classi globali con costruttore non ce ne sono.. non dovrebbe eseguire niente prima della mia funzione..

  8. #8
    si sono funzioni di check a runtime prima di chiamare il main ...
    purtroppo microsoft non da molta documentazione su queste funzioni.

    Comunque ho dimenticato che facendo come ho detto io nel post sopra, devi ripristinare l'include delle librerie standard.

    E comunque devi compilare in modalità Release non Debug

  9. #9
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    131
    che stupido che sono

    ok, compilo in modalità release con le stesse opzioni e mi viene fuori soltanto un errore :
    codice:
    error LNK2001: simbolo esterno @__security_check_cookie@4 non risolto
    ma se darà errore sempre perchè mettono l'opzione /NODEFAULTLIB???

  10. #10
    Originariamente inviato da XAlbeX
    che stupido che sono

    ok, compilo in modalità release con le stesse opzioni e mi viene fuori soltanto un errore :
    codice:
    error LNK2001: simbolo esterno @__security_check_cookie@4 non risolto
    ma se darà errore sempre perchè mettono l'opzione /NODEFAULTLIB???
    includi bufferoverflowU.lib

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.