2011-01-22 15 views
9

Sto provando a creare un file oggetto utilizzando CMake, ma non riesco a convincere CMake a creare qualcosa di diverso da un eseguibile completo. Praticamente sto cercando il risultato della seguente compilazione (il risultato sarà caricato su un target VxWorks e legata quindi):Come si produce solo un file oggetto (* .o) da un target di build CMake?

$(CC) $(CFLAGS) $(INC_DIRS) -c src/object.c 

Ho provato a cambiare la proprietà output_name del bersaglio, ma che doesn' T sembrano aiutare, neanche.

Penso di poter aggirare questo problema utilizzando un comando personalizzato, ma sembra che sto lavorando anche alle cose carine fornite da CMake.

Grazie per il vostro aiuto!

+0

Mi chiedo perché si desidera il file oggetto. Non è possibile costruire una lib statica con CMake? Se necessario, una lib statica da un solo file sorgente? In alternativa, puoi provare a collegare l'eseguibile in ogni caso e "riutilizzare" i file oggetto generati. –

+0

@Andre Un vantaggio sarebbe quello di lavorare sulla correzione degli errori di compilazione per un singolo file quando sai che ci sono errori di compilazione anche altrove nel progetto (ad esempio se stai lavorando a stretto contatto con un altro sviluppatore su un codice che non è ancora pronto per il consumo generale) senza dover modificare i file 'CMakeLists.txt'. –

risposta

1

Vorrei andare al percorso del comando personalizzato. Ricorda che puoi ancora utilizzare questi file oggetto per la compilazione con CMake se si impostano le proprietà del file di origine GENERATED e EXTERNAL_OBJECT.

4

Questa risposta è stata data a me nel CMake mailing list e ha funzionato come un fascino:

guardare il seguente ${CMAKE_SOURCE_DIR}/cpo script:

#!/bin/sh 
d=$1; shift 
while [ "$1" != "--" ]; do 
    cp $1 $d/$(basename $1); shift 
done 

Ora, guardare il seguente CMakeLists.txt:

Lo script di avvio "cpo" rende l'obiettivo "f" produrre i file oggetto in la directory passata come prima par Ameter invece di una biblioteca; tutto il resto dovrebbe funzionare come al solito. La chiave è l'accesso allo script al segnaposto <OBJECTS>, quindi può operare sull'oggetto mentre il comando di collegamento effettivo dopo "-" viene ignorato. Quella modo, è possibile utilizzare tutte le funzionalità di CMake per la compilazione e intercettazione giusto prima che il collegamento abbia luogo. IMO, questa è una soluzione pulita che dovrebbe essere facilmente adattabile alle tue esigenze; il lato negativo è che l'uso di RULE_LAUNCH_LINK è limitato ai generatori Makefile.

Problemi correlati