2010-03-08 35 views
7

Tôi đang xây dựng ứng dụng C++ với CMake. Nhưng nó sử dụng một số tập tin nguồn trong C. Dưới đây là cấu trúc đơn giản:Liên kết các tệp C và CXX trong CMake

trunk/CMakeLists.txt:

project(myapp) 
set(CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS} -g -Wall") 
add_subdirectory (src myapp) 

trunk/src/main.cpp:

#include "smth/f.h" 
int main() { f(); } 

trunk/src/CMakeLists.txt:

add_subdirectory (smth) 
link_directories (smth)  
set(APP_SRC main) 
add_executable (myapp ${APP_SRC}) 
target_link_libraries (myapp smth) 

trunk/src/smth/fh:

#ifndef F_H 
#define F_H 
void f(); 
#endif 

trunk/src/smth/fc:

#include "f.h" 
void f() {} 

trunk/src/smth/CMakeLists.txt

set (SMTH_SRC some_cpp_file1 some_cpp_file2 f) 
add_library (smth STATIC ${SMTH_SRC}) 

Vấn đề là: i chạy gmake, nó biên dịch tất cả các tập tin và khi nó liên kết tất cả các libs với nhau, tôi nhận được:

undefined reference to `f()` in main.cpp 

nếu tôi đổi tên fc thành f.cpp mọi thứ diễn ra tốt đẹp. Sự khác biệt và cách xử lý nó là gì?

Cảm ơn

+1

Đọc tốt về điều này: 'Trộn C và C++:' http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html – Lazer

Trả lời

14

Thay đổi f.h tới:

#ifndef F_H 
#define F_H 

#ifdef __cplusplus 
extern "C" { 
#endif 

void f(); 

#ifdef __cplusplus 
} 
#endif 

#endif 
2

Vui lòng thêm lính gác C đến tất cả các file C của bạn. Tham khảo này link để biết thêm chi tiết

Các vấn đề liên quan