2011-11-11 20 views
13

Escribimos una aplicación principalmente en C pero algunos submódulos están escritos en C++ (en Linux). El problema es cómo escribir archivos CMakeLists.txt para usar g++ para algunos subdirectorios y gcc para otro.Mezcla C y C++ con CMAKE

Respuesta

13

El compilador y el enlazador generalmente vienen determinados por la extensión del archivo si no se establece de otra manera. Por lo tanto, siempre que las terminaciones de los archivos estén correctas, su código se compilará y vinculará con el compilador correcto.

En una nota lateral, recuerde hacer las declaraciones externas correctas de C, si mezcla C y C++.

+2

"si no se establece de otra manera", es decir, en la parte superior de 'CMakeLists.txt', use' project (myproject) 'en vez de 'proyecto (miproyecto C)'. – congusbongus

1

La diferencia entre g ++ y gcc es básicamente que g ++ pasa -lstdC++ al enlazador. Simplemente agregue la biblioteca estándar de C++ como una dependencia explícita de los módulos de C++.

Para ser claros, gcc puede compilar el código C++. gcc y g ++ son lo mismo en este sentido. La diferencia es solo que al usar g ++ no tiene que decirle explícitamente al compilador que se vincule con libstdC++.

+0

Gracias, he reescrito la pregunta. Esta parte está bien, pero me gustaría saber cómo especificar gcc/g ++ para subdirectorios específicos. – Cartesius00

+0

¿Cuál es la necesidad de usar g ++ en algunos subdirectorios si solo puede usar gcc y depender explícitamente de libstdC++ cuando sea necesario? – bames53

+0

Tenemos que mezclar algunos códigos C y C++ existentes. – Cartesius00

4

Puede establecer la propiedad LANGUAGE de sus archivos de origen en "CXX". Ver documentation.

5

CMake lo hace automáticamente. Se puede entremezclar libremente ambos tipos de archivos en el archivo de CMakeLists.txt:

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

hago esto todo el tiempo y simplemente funciona.

+2

Tenga en cuenta que necesita protectores de C-header. Entonces en code.cpp dirías 'extern" C "{#include" more_code.h "}' – Unapiedra