2011-03-25 18 views
25

Sto provando a compilare sorgenti C e C++ usando GCC.Compilare insieme file C e C++ usando GCC

gcc -std=c++0x test.cpp -std=c99 test.c -lstdc++

Ora, questo funziona bene, tranne che ottengo due avvertimenti.

cc1plus: warning: command line option "-std=c99" is valid for C/ObjC but not for C++ 
cc1: warning: command line option "-std=c++0x" is valid for C++/ObjC++ but not for C 

Pertanto non è possibile utilizzare -Werror con questa impostazione. Questi avvertimenti possono essere soppressi in qualche modo?

+0

Quello che stai facendo è molto diverso da quello che stai facendo. Per prima cosa impostate lo standard di linguaggio su C++ 0x e quindi impostandolo su C99, che equivale a usare solo C99 per i file _both_. Tuttavia, compilare C++ in modalità C99 è impossibile, quindi per il file '.cpp', il compilatore tornerà al suo valore predefinito, che è C++ 98. Quindi stai compilando il file C in C99 e il file C++ in C++ 98. Durante l'analisi delle opzioni, GCC rileva che sono disponibili file incompatibili per entrambe le versioni di lingua, quindi invia avvisi per ciascuna opzione. – Damon

risposta

40

compilare i file separatamente, legame con g ++

gcc -c -std=c99 -o file1.o file1.c 
g++ -c -std=c++0x -o file2.o file2.cpp 
g++ -o myapp file1.o file2.o 
+0

Sì, certo, ma ho bisogno di compilarlo in una chiamata GCC.Sto usando un'API per chiamare GCC e posso aggiungere solo flag. –

+0

@Let_Me_Be: Quindi dovrai scrivere uno script/wrapper e chiamarlo, o compilare il tuo c come C++ senza specificare C99 – Erik

+0

Hmm, potrei effettivamente precompilare la parte C++ (dato che non cambierà) :-) –

1

Invece di utilizzare gcc, utilizzare g ++ Ciò vale sia per i file .cpp che per i file c.

+1

Ma 'g ++' non compila i file 'C' come' C++ '? –

+0

Mentre si fornisce l'istruzione di compilazione, se si specifica esplicitamente come .c, quindi per quanto ne so, non può assumere come .cpp. Ma per favore conferma questo con qualcuno che sa correttamente. – Chaithra

+5

I file sorgente C compilati con g ++ verranno compilati come codice C++. –

2

gcc è il compilatore C e g++ è il compilatore C++. Stai mescolando le due lingue con stili diversi. Compilare e quindi collegare:

gcc -std=c99 -c -o test.c.o test.c 
g++ -std=c++0x -c -o test.cpp.o test.cpp 
g++ -o executable test.cpp.o test.c.o 
+1

Hai bisogno di un extra '=' e a '-c' nella tua riga di compilazione g ++. – Erik

1

Questo è molto rilevante per Android NDK. Fortunatamente, c'è una brutta soluzione. Per rendere tutti i file C compilati come c99, e tutti i file CPP come c++0x, aggiungere le seguenti righe al file di Android.mk:

LOCAL_CPPFLAGS += -std=c++0x 
LOCAL_C99_FILES := $(filter %.c, $(LOCAL_SRC_FILES)) 
TARGET-process-src-files-tags += $(call add-src-files-target-cflags, $(LOCAL_C99_FILES), -std=c99) 

Questo funziona nell'ultima r8b NDK con il braccio-linux-androideabi-4.6 toolchain, ma non posso garantire che funzionerà nelle versioni future e non l'ho testato con le versioni precedenti.

14

se qualcun altro si sta chiedendo il modo migliore per farlo in Android, è questo:

LOCAL_CFLAGS := -Werror 
LOCAL_CONLYFLAGS := -std=gnu99 
LOCAL_CPPFLAGS := -std=c++0x 
Problemi correlati