Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219

    [C/C++]Una domanda sulla compilazione/esecuzione

    Tutto ciò che è statico viene allocato durante la compilazione, mentre ciò che è dinamico viene allocato a runtime.
    Quindi le librerie dinamiche dovrebbero essere "consultate" a runtime.Nel senso che se durante l' esecuzione del programma viene eseguita la printf, si cerca nel file system l' header stdio.h per andare a "pescare" la funzione.
    Mi chiedo allora come fa il programma ad essere portabile, se ad esempio sposto il programma dal computer nel quale ho compilato il programma, ad un altro computer con la stessa architettura, ma senza GCC installato (nel caso usi windows), il programma spostato sull' altro computer funziona o no?
    Perchè quando va a cercare le funzione dovrebbe non trovarle, non essendoci gli header che cerca.Non sarebbe portabile, eppure i programmi in C sono portabili,potete chiarirmi questa cosa?

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    A essere precisi le librerie dinamiche sono solo quelle che si caricano eplicitamente con dlopen() / LoadLibrary. Il resto è tutto statico. Il fatto che siano in moduli diversi è solo per praticità/altro.

    La printf() non è caricata dinamicamente, ma il relativo file lib, (o equivalente per Unix) è linkato in automatico dall'ide di sviluppo o scritto manualmente nel makefile relativo.

    se ad esempio sposto il programma dal computer nel quale ho compilato il programma, ad un altro computer con la stessa architettura, ma senza GCC installato (nel caso usi windows), il programma spostato sull' altro computer funziona o no?
    Dipende da come è stata linkata la CRT. Ora non ricordo le policy di uso del GCC, ma per il VC esiste la possibilità di incorporare nel codice la CRT, a prezzo di un eseguibile cicciotto, o lasciarla scorporata dal sorgente e usarla in forma di DLL. Nel primo caso l'eseguibile te lo porti dove vuoi, nel secondo la CRT in forma DLL te la devi portare dietro.
    Nota comunque che pure essendo in DLL, la CRT non è linkata dinamicamente, ma staticamente a causa del .lib usato nel makefile.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  3. #3
    Originariamente inviato da shodan
    Nota comunque che pure essendo in DLL, la CRT non è linkata dinamicamente, ma staticamente a causa del .lib usato nel makefile.
    Direi che è più una via di mezzo, la .lib in realtà è una import library che contiene degli stub per le funzioni vere e proprie (se non ricordo male non fanno altro che una CALL PTR usando l'indirizzo della funzione corrispondente nella IAT della dll); poi se non sbaglio il linker in genere è sufficientemente furbo da ottimizzare ulteriormente la questione saltando lo stub.
    Amaro C++, il gusto pieno dell'undefined behavior.

  4. #4
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Quindi in realta il linking e' statico?

  5. #5
    Dipende dalle impostazioni che dai al compilatore/linker. Se usi il linking dinamico sarà necessario che su ogni macchina su cui porti la tua applicazione ci sia installata la stessa versione della CRT (o una versione compatibile).

    Tra parentesi, gli header non c'entrano niente, quelli contengono solo i prototipi e servono al compilatore per sapere quali sono i prototipi delle funzioni di libreria, il codice/gli stub stanno nelle librerie statiche/dinamiche/di importazione.
    Amaro C++, il gusto pieno dell'undefined behavior.

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.