2011-11-11 17 views
13

Scriviamo un'applicazione principalmente in C ma alcuni sotto-moduli sono scritti in C++ (su Linux). Il problema è come scrivere i file CMakeLists.txt per utilizzare g++ per alcune sottodirectory e gcc per un altro.Miscelazione di C e C++ con CMAKE

risposta

13

Il compilatore e il linker sono in genere determinati dall'estensione del file se non diversamente impostato. Finché le terminazioni dei file vanno bene, il tuo codice è compilato e collegato al compilatore corretto.

In una nota a margine, ricordarsi di eseguire le dichiarazioni C extern corrette, se si mescolano C e C++.

+2

"se non è impostato diversamente", cioè nella parte superiore di 'CMakeLists.txt', utilizzare' project (myproject) 'invece di dire 'progetto (myproject C)'. – congusbongus

1

La differenza tra g ++ e gcc è fondamentalmente che g ++ passa -lstdC++ al linker. Basta aggiungere la libreria standard C++ come dipendenza esplicita dei moduli C++.

Per essere chiari, gcc può compilare codice C++. gcc e g ++ sono uguali in questo senso. La differenza è solo che quando usi g ++ non devi dire esplicitamente al compilatore di collegarsi a libstdC++.

+0

Grazie, ho riscritto la domanda. Questa parte è OK, ma mi piacerebbe sapere come specificare gcc/g ++ per sottodirectory specifiche. – Cartesius00

+0

Qual è la necessità di usare g ++ su alcune sottodirectory se si può semplicemente usare gcc e dipendere esplicitamente da libstdC++ quando necessario? – bames53

+0

Dobbiamo mescolare alcuni codici C e C++ esistenti. – Cartesius00

4

È possibile impostare la proprietà LANGUAGE dei file di origine su "CXX". Vedi documentation.

5

CMake esegue questa operazione automaticamente. È possibile mischiare liberamente entrambi i tipi di file nel file CMakeLists.txt:

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

Lo faccio tutto il tempo e funziona solo.

+2

Nota che hai bisogno di protezioni C-header. Quindi in code.cpp diresti "extern" C "{#include" more_code.h "}' – Unapiedra