2010-03-08 17 views
7

में सी और सीईओ फाइलों को जोड़ना मैं सीएम + के साथ सी ++ ऐप बना रहा हूं। लेकिन यह सी में कुछ स्रोत फ़ाइलों का उपयोग करता है यहाँ सरलीकृत संरचना है:सीएमके

ट्रंक/CMakeLists.txt:

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

ट्रंक/src/main.cpp:

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

ट्रंक/src/CMakeLists.txt:

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

ट्रंक/src/ख़ाली/एफ एच:

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

ट्रंक/src/ख़ाली/एफसी:

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

ट्रंक/src/ख़ाली/CMakeLists.txt

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

समस्या है: मैं gmake चलाने के लिए, यह सभी फाइलों को संकलित करता है तथा जब यह सभी libs को एक साथ जोड़ता है, तो मुझे मिलता है:

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

अगर मैं fc में fc का नाम बदलता हूं तो सब कुछ ठीक हो जाता है। क्या अंतर है और इसे कैसे संभालना है?

धन्यवाद

+1

इस बारे में एक अच्छा पठन: 'मिक्सिंग सी और सी ++:' http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html – Lazer

उत्तर

14

f.h बदलें:

#ifndef F_H 
#define F_H 

#ifdef __cplusplus 
extern "C" { 
#endif 

void f(); 

#ifdef __cplusplus 
} 
#endif 

#endif 
2

कृपया अपने सभी सी फ़ाइलों के लिए सी गार्ड जोड़ें। अधिक जानकारी के लिए link का संदर्भ लें