我具有以下設置:鏈接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
而不重命名它們?
我認爲,爲extern「C」將防止重命名的發生。即。 extern「C」void sol(){cout <<「HW !! \ n」;} – bizzehdee
'extern「C」'http://en.wikipedia.org/wiki/Compatibility_of_C_and_C%2B%2B#Linking_C_and_C.2B。 2B_code –
在混合的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()'或者其他任何你喜歡的名字。 –