2011-03-13 79 views
4

我的C語言編寫的函數的靜態庫比方說,頭文件被稱爲myHeader.h,看起來像:引用C函數從C++

#ifndef MYHEADER_H 
#define MYHEADER_H 

void function1(); 
void function2(); 

#endif 

功能1和功能2有沒有什麼太特殊了。比方說,他們在一個名爲impl1.c它看起來像存在:

#include "myHeader.h" 

void function1() { 
    // code 
} 
void function2() { 
    // more code 
} 

所有到目前爲止提到的代碼被編譯成一些所謂libmylib.a添加靜態庫。我寧願不修改任何用於構建這個庫的代碼。我也有一個C++頭(cppHeader.h)看起來像:

#ifndef CPPHEADER_H 
#define CPPHEADER_H 

class CppClass { 
    private: 
     double attr1; 
    public: 
     void function3(); 
}; 
#endif 

然後cppHeader.cpp樣子:

#include "cppHeader.h" 
#include "myHeader.h" 

// constructor 
CppClass::CppClass(){} 

void CppClass::function3() { 
    function1(); 
} 

當我嘗試編譯此,我得到一個未定義的錯誤對function1()的引用。我相信在編譯時我已經正確地鏈接了所有東西。我在C++中很生疏。我確信我只是在做一些愚蠢的事情。我希望我的簡單示例代碼足以說明問題。

在此先感謝您的幫助!

+0

不能說'C++東西',但是'C'你可能想使你的函數聲明適當的原型......只需指定'void'的參數爲:'無效的樂趣ction1(無效);' – pmg 2011-03-13 20:57:12

+2

@pmg - 我認爲沒有自1989年以來 「要求」! – Flexo 2011-03-13 21:00:37

+1

http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html – Flexo 2011-03-13 21:03:12

回答

6

另一種解決方案(到一個由揚原本的建議)就是圍繞你的「C」標頭:

#ifdef __cplusplus 
extern "C" { 
#endif 

#ifdef __cplusplus 
} 
#endif 

前述具有節省你要記住的事:

extern "C" { 
#include "foo.h" 
} 

每到一個地方,你使用foo.h

4

確保使用:

extern "C" { 
#include "myHeader.h" 
} 

要不然C++編譯器將生成它們的名字,重整符號的名稱。