2014-02-20 42 views
1

我具有以下設置:鏈接C和C++對象文件

main.c中:

extern void sol(); 
int main(){ 
    sol(); 
} 

sol.cc:

#include<iostream> 
using namespace std; 
void sol(){ 
    cout<<"HW!!\n"; 
} 

予編譯爲單獨的對象文件:

$gcc main.c -c 
$g++ sol.cc -c 

但是當我試圖鏈接它們到一個可執行文件,

$g++ main.o sol.o 

我得到:main.c:(.text+0x7): undefined reference to 'sol'nm sol.o表明,有00000000 T _Z3solv,而nm main.o需要U sol。我發現C++重命名函數以避免重載函數的名稱相同。有沒有什麼辦法告訴編譯器sol.o包含重命名的函數,或編譯sol.cc而不重命名它們?

+0

我認爲,爲extern「C」將防止重命名的發生。即。 extern「C」void sol(){cout <<「HW !! \ n」;} – bizzehdee

+0

'extern「C」'http://en.wikipedia.org/wiki/Compatibility_of_C_and_C%2B%2B#Linking_C_and_C.2B。 2B_code –

+0

在混合的C和C++程序中,通常最好使main()函數成爲C++函數,即使它由int main(int argc,char ** argv){return c_main(argc,argv ); (完全相同)(聲明相當於'extern「C」int c_main(int argc,char ** argv);'in scope)。原來的C'main()'只是簡單地改名爲'c_main()' - 或'real_main()'或者其他任何你喜歡的名字。 –

回答

1

您必須使用extern "C"聲明作出sol提供給C.將這個變成一個共同的標題:

extern "C" void sol(); 
+2

如果你想要一個通用的頭文件,你需要使用'#ifdef __cplusplus',因爲'extern「C」'在C中是無效的。 –

3
extern "C" void sol() 
{ 
    cout<<"HW!!\n"; 
}