2011-11-11 55 views
13

Chúng tôi viết một ứng dụng chủ yếu trong C nhưng một số mô-đun phụ được viết bằng C++ (trên Linux). Vấn đề là làm thế nào để viết CMakeLists.txt tệp để sử dụng g++ cho một số thư mục con và gcc cho một thư mục khác.Trộn C và C++ với CMAKE

Trả lời

13

Trình biên dịch và trình liên kết thường được xác định bởi phần mở rộng tệp nếu không được đặt khác. Vì vậy, miễn là kết thúc tập tin là tốt, mã của bạn được biên dịch và liên kết với trình biên dịch chính xác.

Trên ghi chú bên, hãy nhớ thực hiện đúng khai báo C bên ngoài, nếu bạn trộn C và C++.

+2

"nếu không được đặt khác", nghĩa là ở đầu 'CMakeLists.txt', sử dụng' project (myproject) 'thay vì nói 'project (myproject C)'. – congusbongus

1

Sự khác biệt giữa g ++ và gcc về cơ bản là g ++ chuyển -lstdC++ thành trình liên kết. Chỉ cần thêm thư viện chuẩn C++ như là một phụ thuộc rõ ràng của các mô-đun C++.

Để rõ ràng, gcc có thể biên dịch mã C++. gcc và g ++ là như nhau trong lĩnh vực này. Sự khác biệt chỉ là khi sử dụng g ++, bạn không cần phải trình bày rõ ràng trình biên dịch để liên kết tới libstdC++.

+0

Cảm ơn bạn, tôi đã viết lại câu hỏi. Phần này là OK, nhưng tôi muốn biết, làm thế nào để xác định gcc/g ++ cho các thư mục con cụ thể. – Cartesius00

+0

Nhu cầu sử dụng g ++ trên một số thư mục phụ là gì nếu bạn chỉ có thể sử dụng gcc và phụ thuộc rõ ràng vào libstdC++ khi cần thiết? – bames53

+0

Chúng ta phải trộn một số mã C và C++ hiện có. – Cartesius00

4

Bạn có thể đặt thuộc tính LANGUAGE của tệp nguồn thành "CXX". Xem documentation.

5

CMake tự động thực hiện việc này. Bạn có thể tự do trộn lẫn cả hai loại tệp trong tệp CMakeLists.txt của mình:

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

Tôi làm việc này mọi lúc và nó hoạt động.

+2

Lưu ý rằng bạn cần bảo vệ tiêu đề C. Vì vậy, trong code.cpp bạn muốn nói 'extern" C "{#include" more_code.h "}' – Unapiedra