2009-03-16 11 views
28

Abbiamo un grande progetto C++ che abbiamo usato per compilare con l'opzione/MP per sfruttare i più core.Sostituzione per #import in Visual C++

Tuttavia, di recente abbiamo introdotto un codice che utilizza #import su un paio di tlb e #import è incompatibile con/MP, il che significa che siamo tornati a compilazioni a thread singolo e molto più tempo per ottenere il caffè.

Qualche suggerimento su come ottenere #import e/MP per giocare bene? C'è uno strumento che genererà staticamente le intestazioni C++ da un #import come una fase di pre-build?

Aggiornamento:

Seguendo il consiglio di Matt funzionava benissimo. Per chiunque altro inciampare su questo in google:

  1. creare un progetto lib statica separata
  2. istituito abbastanza include modo da poter mettere la dichiarazione #import nel progetto lib
  3. rendere il progetto principale dipende dalla lib progetto (per garantire l'ordine corretto di compilazione)
  4. aggiungi cartella temporanea di compilazione del progetto lib al percorso includere per il progetto principale
  5. #include i .tlh file generati in cui si stava facendo la #import
  6. attivare l'interruttore /MP e perdere il tempo di pausa caffè ...

risposta

25

Perché non solo #include le intestazioni generate create da #import?

+1

Perfetto ... Non avevo prestato attenzione ai file 'tlh' nella directory di output, ma sembra che sia esattamente ciò di cui ho bisogno –

+0

Eccellente. Non lo sapevo mai! – kizzx2

1

Si potrebbe dividere il progetto in due parti, una che più o meno l'importazione disabilita/MP e una che fa tutto il resto abilitando/MP.

2

Un'opzione è spostare le importazioni in una DLL separata e fornire loro classi di wrapper utilizzando un puntatore opaco. Quindi disabilita/MP solo per quella DLL, e il resto della build dovrebbe andare bene.

+0

Ciò funzionerebbe, ma separando le importazioni in una DLL separata e avvolgendole sarebbe un grande sforzo. –

+0

Sì, ma nel processo accelererai le tue build e disaccoppierà la libreria che stai utilizzando dal tuo utilizzo. – Eclipse

8

(io sono un po 'in ritardo a questa domanda, ma questo è un problema vicino e caro al mio cuore.)

si potrebbe tentare di utilizzare la strada vecchia scuola di accedere agli oggetti COM da C/C++ . Ciò coinvolge gli sviluppatori degli oggetti COM che forniscono i file .h sul lato client che dispongono delle versioni C/C++ delle interfacce COM. Questi file sembrano versioni più semplici di ciò che fa #import.

Da dove provengono questi file? Se gli oggetti COM sono scritti in C/C++ (VC++), questi vengono dal compilatore MIDL. Questo strumento da riga di comando accetta file ODL/IDL e crea codice sorgente C/C++. Parte di ciò che emette è utile per l'applicazione client.

Se si dispone della fonte degli oggetti COM, è possibile che questi file siano già presenti!

Se si dispone solo di file TLB, è possibile utilizzare OLE/COM Object Viewer (OLEVIEW.exe - fornito con almeno VC++ 6.0) si apre la libreria dei tipi e il file save-as e OLD/IDL. Quindi eseguire il compilatore MIDL per generare i file di inclusione C/C++ sul lato client. Esiste la possibilità che un oggetto COM di terze parti venga fornito con questi file, ma spesso non lo fanno (Ricordo Crystal Reports ha fatto per un po ', quindi ho smesso di spedirli, ci ha rovinato in modo sincero, ma sto divagando).

L'utilizzo di puntatori intelligenti ATL (e altre classi di supporto) con le classi di interfaccia create da MIDL è quasi piacevole come ciò che crea #import. Dipende da quante delle # funzioni specifiche all'importazione usate.

Per/MP Ho fatto entrambe le cose che sto suggerendo e alcune delle risposte suggerite da Matt Davison.

+0

Possiedo i sorgenti per gli oggetti COM, ma i file di intestazione generati mancano gli spazi dei nomi e il semplice wrapping degli #include negli spazi dei nomi non funziona. C'è un modo per ottenere include compatibili con ciò che #import fa? –

7

È possibile utilizzare l'opzione/MP per il progetto nel suo complesso, e quindi fare un'eccezione per un singolo file utilizzando l'opzione /MP1.

+0

funziona davvero? –

2

Se è possibile limitare il numero di file che si # importano, è possibile inserirli nel file di intestazione precompilato (ad esempio stdafx.h) che è già automaticamente escluso da/MP. Ciò evita il problema menzionato, poiché tutti gli altri file attenderanno il compilatore fino a quando stdafx.cpp non sarà completato e tutti "erediteranno" le stesse definizioni importate.