2011-11-11 9 views
13

Piszemy aplikację głównie w C, ale niektóre podmoduły są napisane w C++ (w systemie Linux). Problem polega na tym, jak napisać pliki CMakeLists.txt, aby użyć g++ dla niektórych podkatalogów i gcc dla innego.Mieszanie C i C++ z CMAKE

Odpowiedz

13

Kompilator i linker jest zwykle określany przez rozszerzenie pliku, jeśli nie jest ustawione inaczej. Dopóki końcówki plików są w porządku, twój kod jest kompilowany i połączony z właściwym kompilatorem.

Na marginesie pamiętaj, aby wprowadzić poprawne deklaracje C, jeśli mieszkasz C i C++.

+2

"jeśli nie jest ustawione inaczej", tj. Na górze 'CMakeLists.txt', użyj' projektu (myproject) 'zamiast powiedzieć 'projekt (myproject C)'. – congusbongus

1

Różnica między g ++ i gcc jest zasadniczo taka, że ​​g ++ przekazuje -lstdC++ do linkera. Po prostu dodaj bibliotekę standardową C++ jako jawną zależność modułów C++.

Aby było jasne, gcc może kompilować kod w C++. gcc i g ++ są pod tym względem takie same. Różnica polega tylko na tym, że używając g ++ nie musisz jawnie mówić kompilatorowi, żeby łączył się z libstdC++.

+0

Dziękuję, poprawiłem pytanie. Ta część jest OK, ale chciałbym wiedzieć, jak określić gcc/g ++ dla konkretnych podkatalogów. – Cartesius00

+0

Jaka jest potrzeba używania g ++ w niektórych podkatalogach, jeśli możesz po prostu użyć gcc i jawnie polegać na libstdC++, kiedy to konieczne? – bames53

+0

Musimy wymieszać niektóre istniejące kody C i C++. – Cartesius00

5

CMake robi to automatycznie. Można swobodnie wymieszać oba rodzaje plików w pliku CMakeLists.txt:

. . . 
add_executable(
    my_program 
    code.cpp 
    more_code.c 
) 

Robię to cały czas i po prostu działa.

+2

Pamiętaj, że potrzebujesz osłon głowicy C. Więc w code.cpp powiesz "extern" C "{#include" more_code.h "}' – Unapiedra