Utilizzo di compilatori C ++ e versioni linguistiche differenti durante lo sviluppo di un singolo eseguibile


15

La nostra azienda acquisterà un codice sorgente grande e molto complesso per le comunicazioni via satellite.

È codificato in C ++ e codificheremo le aggiunte ad esso, anche in C ++, collegando il nostro codice con il codice acquistato in un'unica unità eseguibile.

  • È necessario utilizzare lo stesso compilatore e la stessa versione del compilatore utilizzati per sviluppare il codice acquistato?

  • È necessario che utilizziamo la stessa versione di C ++ del codice acquistato? Se non utilizza il 2014, potremmo volerne utilizzare alcune funzionalità, ma non se ci potrebbero essere problemi con il mixaggio di versioni diverse.

In teoria, ovviamente, non dovrebbe importare, in particolare la versione del linguaggio, ma è concepibile che versioni diverse del compilatore generino codice oggetto diverso, potenzialmente portando a differenze di temporizzazione, ecc.

Di cosa dovremmo essere a conoscenza?


7
Spero che tu non stia solo acquistando il codice sorgente, ma anche un supporto (da parte di persone qualificate) su di esso.
Basile Starynkevitch,

1
Anzi, lo siamo. E, naturalmente, ho posto anche questa domanda al fornitore. Ma ho pensato che sarebbe stato un buon punto di discussione qui, e un buon riferimento futuro per gli altri in futuro.
Mawg dice di ripristinare Monica il

2
Stai parlando di compilare il codice di terze parti usando un compilatore non supportato, o stai parlando di compilare parti diverse di codice usando diversi compilatori (ad esempio usando quello supportato per il codice che stai acquistando e uno più recente per il tuo codice e poi collegandoli)? O sta decidendo tra quelle parti della domanda?
jpmc26,

3
Anche la versione del linguaggio può essere importante, vedi gcc.gnu.org/wiki/Cxx11AbiCompatibilità per un elenco di versioni (precedenti) del compilatore e piccole differenze nell'ABI. In altre parole: lo stesso compilatore, ma potrebbero essere diverse le impostazioni del linguaggio c ++ (c ++ 03 s c ++ 11).
André,

2
E con MSVC, in generale non è sicuro passare oggetti della libreria standard oltre i limiti (dinamici) della libreria. Vedi ad esempio stackoverflow.com/q/5661738/417197
André

Risposte:


9

È necessario utilizzare lo stesso compilatore e la stessa versione del compilatore utilizzati per sviluppare il codice acquistato?

Dipende.

I compilatori generano codice destinato a un ABI. Alcuni utilizzano un ABI comune (ad esempio, se non sbaglio, sia clang ++ che g ++ target si chiamano Itanium ABI) e dovresti - potrebbero esserci dei bug che ti impediscono di farlo - essere in grado di usare il codice oggetto da entrambi in uno stesso programma (presupponendo ovviamente che si stiano utilizzando versioni destinate alla stessa versione dell'ABI). Lo stesso vale per la versione del compilatore: alcuni prestano più attenzione a mantenere la stessa ABI tra la versione di altri. Ovviamente, a volte tutti hanno bisogno di un cambiamento ABI e potrebbero essere costretti a farlo in un modo non compatibile. E ovviamente, alcune impostazioni come la scelta di uno standard linguistico possono influenzare la scelta dell'ABI.

Quindi c'è il problema della libreria standard. I compilatori (o versioni diverse dello stesso compilatore) stessi possono utilizzare la stessa ABI, eppure la loro libreria standard può essere incompatibile (e alcuni compilatori come clang ++ possono essere utilizzabili con diverse librerie standard). Essere in grado di farlo funzionare può dipendere da ciò che viene utilizzato nell'interfaccia.

In altre parole, devi scavare e trovare le informazioni per il caso specifico in cui ti trovi. Come punto di partenza ed esempio del tipo di informazioni che dovresti cercare, ecco le informazioni fornite da libstdc ++ (la libreria usata da g ++ e in alcune configurazioni di clang ++)


10
ABI = Application Binary Interface
Simon B,

2
Questa risposta riguarda la compatibilità del codice oggetto. OP sta acquistando il codice sorgente .
Corse di leggerezza con Monica il

7
@LightnessRacesinOrbit La domanda parla dell'utilizzo di compilatori diversi per generare un singolo eseguibile. Non è un grande salto pensare: "Intendono compilare il codice di terze parti con un compilatore (probabilmente uno" supportato ") e il proprio codice con un compilatore diverso (probabilmente uno più recente)." (Questo è sicuramente ciò che intendo chiedere all'OP; se lo leggi in modo diverso, potresti voler chiedere all'OP di chiarire.) In tale possibilità o in altri simili, la compatibilità del codice oggetto sembra molto rilevante.
jpmc26,

1
@ jpmc26: "Questo è sicuramente quello che capisco che l'OP chieda; se lo leggi in modo diverso, potresti voler chiedere all'OP di chiarire." OP ha dichiarato chiaramente che la loro società "acquisterà un codice sorgente grande e molto complesso". Inoltre, con dichiarazioni come "è concepibile che versioni diverse del compilatore generino codice oggetto diverso, potenzialmente portando a differenze di temporizzazione", si chiedono cosa cambia quando compilano il codice acquistato con diverse toolchain, non solo la propria. Non credo che ci sia molto spazio per l'interpretazione lì!
Lightness Races con Monica il

8

È necessario utilizzare lo stesso compilatore e la stessa versione del compilatore utilizzati per sviluppare il codice acquistato? È necessario che utilizziamo la stessa versione di C ++ del codice acquistato?

Questa non è principalmente una domanda tecnica. È una domanda legale su ciò che scrivi nel tuo contratto. Assicurati che il fornitore del software ti fornisca una versione da lui garantita utilizzabile nel tuo ambiente. Altrimenti, ci sarà sempre un certo rischio di incorrere in problemi con un compilatore, una versione del compilatore o una versione del linguaggio diversi.

Ciò è particolarmente importante quando si acquista il componente o parti di esso come sorgente chiusa. Anche se il tuo fornitore ti garantisce di poter utilizzare il componente con il tuo attuale ambiente di compilazione, garantisce che ti fornirà aggiornamenti se desideri passare a una versione più recente del compilatore in futuro? Se non hai accesso al codice sorgente completo, probabilmente non avrai molta fortuna nel tentativo di risolvere da solo i problemi di compatibilità. Ecco perché non dovresti semplicemente acquistare il software, ma anche pensare a un contratto di manutenzione a lungo termine con il tuo fornitore.


Questo è in realtà un buon consiglio!
T. Sar - Ripristina Monica il

È davvero, ma, ahimè, è troppo tardi. Come ho osservato il commento di Basile, ho posto anche questa domanda al fornitore. Ma ho pensato che sarebbe stato un buon punto di discussione qui, e un buon riferimento futuro per gli altri in futuro
Mawg dice di reintegrare Monica il

4

La nostra azienda acquisterà un codice sorgente grande e molto complesso per le comunicazioni via satellite. È codificato in C ++ e codificheremo le aggiunte ad esso, anche in C ++, collegando il nostro codice con il codice acquistato in un'unica unità eseguibile.

Suona bene!

È necessario utilizzare lo stesso compilatore e la stessa versione del compilatore utilizzati per sviluppare il codice acquistato?

Parlando in generale, no non è necessario. Lo scopo di C ++ è di agire come un'astrazione su questo tipo di cose, quindi un programma C ++ ben scritto si compila altrettanto bene sulla tua toolchain come ha fatto sull'autore originale, e il programma risultante avrà lo stesso risultato. Le prestazioni possono variare, perché compilatori diversi sono bravi in ​​cose diverse, ma il comportamento fondamentale del programma non dovrebbe cambiare.

Tuttavia, i software scritti in modo errato possono fare affidamento su comportamenti specifici dell'implementazione o persino su comportamenti non definiti. Può fare ipotesi sui tipi integrati o sull'endianità della piattaforma. Anche un software ben scritto potrebbe non avere altra scelta che fare affidamento su estensioni non standard che non sono disponibili sulla toolchain prescelta, oppure potrebbe farlo perché non era semplicemente necessario dedicare tempo ad aggiungere un livello di portabilità entro la durata di il progetto originale.

Alla fine, dovrai chiedere all'autore / venditore per cosa è scritto il codice sorgente. Se affermano che è specificamente scritto, diciamo, Visual Studio 2015 e richiede funzionalità API di Windows, probabilmente dovresti attenersi a questo. Ma se affermano che è portatile, standard C ++, usa qualunque compilatore ti piaccia. Assicurati che il contratto di acquisto includa un accordo di supporto in modo da poter ottenere assistenza gratuita quando si scopre che il fornitore mentiva.

È necessario che utilizziamo la stessa versione di C ++ del codice acquistato? Se non utilizza 2014, potremmo voler utilizzare alcune funzionalità di esso, ma non se potrebbero esserci problemi con il mixaggio di versioni diverse.

Probabilmente. Può essere.

C ++ 03 è per la maggior parte compatibile in avanti, quindi, se il codice è C ++ 03, è improbabile che tu abbia un problema. (Anche se potrebbero essere necessarie alcune modifiche.)

Ma le funzionalità introdotte in C ++ 11 e C ++ 14 non sono compatibili con le versioni precedenti, quindi se il fornitore ha usato, diciamo, lambda C ++ 11 e si tenta di creare il proprio codice in un compilatore C ++ 03, che ha appena vinto non funziona.

In teoria, ovviamente, non dovrebbe importare, in particolare la versione del linguaggio, ma è concepibile che versioni diverse del compilatore generino codice oggetto diverso, potenzialmente portando a differenze di temporizzazione, ecc.

Assolutamente. Se il codice si basa così tanto su un'implementazione specifica per ottenere i risultati previsti, spetta al venditore essere responsabile e informarvi di ciò. Dal momento che viviamo nel mondo reale, raccomando di essere diligente e chiedere loro prima.

E farò eco a quello che gli altri hanno detto: assicurati di avere una sorta di ricorso al supporto, in modo che se rappresentassero in modo errato una delle risposte a queste domande (intenzionalmente o meno), non finiresti per sostenere il costo risultante.


Vale la pena notare: il collegamento non è completamente coperto nelle specifiche C ++. Mentre il codice può essere compilato in più compilatori conformi, non è garantito che tu possa semplicemente collegarli insieme e farlo funzionare.
Cort Ammon - Ripristina Monica il

1
@CortAmmon: dovresti / devi compilare tutti i componenti della distribuzione risultante con toolchain che condividono un ABI. Gli standard ABI non rientrano nell'ambito del C ++. Non penso comunque che l'OP stia chiedendo di mescolare le toolchain.
Lightness Races con Monica il

2

Non si collega il codice, si collegano file di oggetti compilati.

In questo caso sì, l'uso di compilatori C ++ diversi (o anche impostazioni come build di debug / release), o versioni diverse di esse o librerie standard (versioni di) diverse quando si costruiscono parti che interagiranno a livello binario è molto probabile che applicazione se le parti comunicano tra loro utilizzando più di API C.

Funzionalità come container o eccezioni forniscono la stessa interfaccia ma, a livello binario, possono essere implementate in molti modi diversi e incompatibili.

L'uso di un compilatore diverso per compilare l'intero codice è tuttavia un problema diverso. Domande da considerare:

  • Quale piattaforma / architettura ha come target il codice?
  • Per quale standard è stato scritto?
  • Utilizza funzionalità di compilatore non standard?
  • Il codice contiene ipotesi specifiche della piattaforma hardcoded (come sempre considerando che i puntatori occupano 2 byte)?

Esiste anche il rischio che il codice contenga parti che comportano comportamenti indefiniti. Questi potrebbero sembrare che funzionino bene quando si utilizza un compilatore ma falliscono in modo misterioso quando si usa un altro compilatore.


OP sta creando il codice, non il fornitore. OP sta chiedendo come il cambiamento dell'ambiente di compilazione (vedi il fornitore) possa influenzare la generazione del codice, dato lo stesso codice base.
Corse di leggerezza con Monica il

1

È necessario utilizzare lo stesso compilatore e la stessa versione del compilatore utilizzati per sviluppare il codice acquistato?

Bene, il cambio del compilatore può portare ad alcuni problemi; attualmente nella mia azienda, usiamo Clang e MSVC e abbiamo un errore in un compilatore che l'altro non contrassegna come tale.

È necessario che utilizziamo la stessa versione di C ++ del codice acquistato? Se non sta usando il 2014, potremmo voler utilizzare alcune funzionalità di esso, ma non se potrebbero esserci problemi con il mixaggio di versioni diverse.

Non è necessario, ma ovviamente il compilatore dovrebbe supportare la versione C ++ che si desidera utilizzare. C ++ garantisce retro compatibilità a partire da tutte le versioni.


Praticamente il mio pensiero. Che dire delle versioni del compilatore - se usano GCC versione x e l'ultima è x + 2, per esempio?
Mawg dice di ripristinare Monica il

1
Bene, se usano una versione precedente del compilatore che si desidera utilizzare, non ci sono problemi, perché non esistono cose deprecate, il problema potrebbe sollevarsi se stessero usando una versione più recente del compilatore.
LaboPie,

Ma come? Anche io preferirei non farlo. Ma sei a conoscenza di qualsiasi tipo di problema che potrebbe verificarsi?
Mawg dice di ripristinare Monica il

Ma sei a conoscenza di qualsiasi tipo di problema che potrebbe verificarsi? Se stessero usando alcune funzioni che il nostro compilatore non supporterà, il codice semplicemente non verrà compilato.
LaboPie,

1
Una piccola appendice, ovviamente, il problema diventa più grande se il compilatore utilizzato dall'altro ufficio non era importante. Ad esempio un vecchio compilatore di console o qualcosa che funziona con un sottoinsieme di linguaggio.
LaboPie,

1

Un grosso problema quando si modificano i compilatori è il comportamento indefinito: se il codice che si riceve invoca un comportamento indefinito, tutto è possibile, incluso il fatto che il codice funzioni correttamente e superi tutti i test quando si utilizza il compilatore, e si sbaglia terribilmente con il compilatore.

Questo è possibile, ma in quella situazione potresti anche incorrere in problemi se modifichi i livelli di ottimizzazione, usi la versione successiva dello stesso compilatore e così via. Quindi niente che tu possa evitare.


Questo è un buon argomento per usare lint e forse valgrind .
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.