2011-03-25 14 views
25

Próbuję skompilować źródła C i C++ razem przy użyciu GCC.Kompilowanie plików C i C++ razem przy użyciu GCC

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

Teraz, to działa dobrze, poza tym, że mam dwa ostrzeżenia.

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 

Z tego powodu nie mogę używać -Werror w tej konfiguracji. Czy te ostrzeżenia mogą być w jakiś sposób stłumione?

+0

To, co robisz, jest bardzo różne od tego, co robisz. Najpierw ustawiasz standard języka na C++ 0x, a następnie ustawiasz go na C99, co jest równoznaczne z użyciem C99 dla _obrobowych plików. Jednak kompilacja C++ w trybie C99 jest niemożliwa, więc dla pliku '.cpp' kompilator wróci do domyślnego, czyli C++ 98. Dlatego kompilujesz plik C w C99, a plik C++ w C++ 98. Podczas analizowania opcji GCC widzi, że masz niezgodne pliki dla każdej z opcji wersji językowej, a więc wyłącza ostrzeżenia dla każdej opcji. – Damon

Odpowiedz

40

Kompilacja plików osobno, połączyć z 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

Tak, oczywiście, ale muszę skompilować go w jednym wywołaniu GCC.Używam API do wywoływania GCC i mogę tylko dodawać flagi. –

+0

@Let_Me_Be: Wtedy musisz albo napisać skrypt/opakowanie i wywołać to, albo skompilować c jako C++ bez określania C99 – Erik

+0

Hmm, mógłbym wstępnie skompilować część C++ (ponieważ to się nie zmieni) :-) –

1

Zamiast używać gcc użyj g ++ Dotyczy to zarówno plików .cpp, jak i c.

+1

Ale czy 'g ++' nie skompiluje plików 'C' jako' C++ '? –

+0

Podając instrukcję kompilacji, jeśli określisz jawnie jako .c, to według mojej wiedzy, nie może to potrwać jako .cpp. Ale proszę potwierdź to z kimś, kto dobrze wie. – Chaithra

+5

Pliki źródłowe C skompilowane za pomocą g ++ zostaną skompilowane jako kod C++. –

2

gcc jest kompilator C i g++ jest kompilator C++. Miksujesz dwa języki z różnymi stylami. Skompiluj i dodaj:

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

Potrzebujesz dodatkowych '=' i '-c' w linii g ++ kompilacji. – Erik

1

Jest to bardzo istotne dla Androida NDK. Na szczęście istnieje brzydkie obejście. Aby wszystkie pliki C skompilowane jako c99 oraz wszystkie pliki CPP jak c++0x dodaj następujące linie do Android.mk plik:

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) 

Działa to w najnowszym R8b NDK z arm-linux-androideabi-4,6 toolchain, ale nie mogę zagwarantować, że zadziała w przyszłych wersjach i nie przetestowałem go we wcześniejszych wersjach.

14

jeśli ktoś zastanawia się, że najlepszym sposobem, aby to zrobić w Androidzie, to w ten sposób:

LOCAL_CFLAGS := -Werror 
LOCAL_CONLYFLAGS := -std=gnu99 
LOCAL_CPPFLAGS := -std=c++0x 
Powiązane problemy