2013-07-15 73 views
1

我有a.c b.cpp文件。未定義引用「fun2()」

/****** a.c ******/ 
fun1(...) 
{ 
    .......... 

    fun2(...); /* function present in b.cpp */ 

    .......... 
} 

/******* b.cpp *******/ 
extern "C" int fun2(...); 
int fun2(...) 
{ 
    .......... 

} 

我編的代碼如下:

a.o:a.c b.o 
    gcc -c -o a.o a.c b.o 

b.o:b.cpp 
    g++ -c -o b.o b.cpp 

但我發現了錯誤未定義參考 「FUN2()」。 這是編譯的正確方法還是我需要改變任何東西?

+0

檢查你的fun2的前向聲明和fun2的定義是否有相同的參數。如果有相同的gcc應該編譯它沒有任何錯誤。 – loentar

+0

正如rems4e回答的那樣,您需要一個函數原型。但你的鏈接也是錯誤的。您應該首先編譯源文件,然後在最後鏈接目標文件:'gcc -c a.o a.c && g ++ -c b.o b.cpp && g ++ -o myprogram a.o b.o' –

+0

rems4e在100%不正確。所有「未知」C函數都有隱式聲明。請參閱http://stackoverflow.com/questions/4914589/c-prototype-functions。您可以通過添加頭文件或直接聲明將'fun2'的原型添加到'a.c'中,但這是可選的。當你在cpp中聲明'extern「C」'時,'b.o'中出現的符號'fun2'解鎖並且連接器將會看到那個符號。 – loentar

回答

3
extern "C" int fun2(...); 

你有b.cpp該行是函數的定義在哪裏,告訴它做的函數「C」聯動,但你不必在AC告訴它相應的原型它存在的功能。

/****** a.c ******/ 
extern int fun2(...); 
fun1(...) 
{ 
    .......... 

    fun2(...); /* function present in b.cpp */ 

    .......... 
} 

會解決它。或者把它放在標題中

// b.h 
#pragma once 

// tell c++ you want these externs to have C linkage 
#ifdef __cplusplus 
extern "C" { 
#endif 

// list your "C" accessible functions here. 
extern int fun2(...); 

// end the extern scope 
#ifdef __cplusplus 
}; 
#endif 

// a.c 
#include "b.h" 

// b.cpp 
#include "b.h" 
+1

不完全。它在b.cpp中是必需的,所以函數是'extern「C」'。在a.c中,只需要原型,而不是'extern「C」'。 –

+0

不是真的.. C編譯器不知道「extern」 – loentar

+0

@NikosC。是的 - 在我發佈帖子後立即修復。 – kfsone

5

您需要在a.c中添加該函數的原型。

1

爲什麼從目標文件構造目標文件? 您不需要將b.o鏈接到a.o,只需從其相應的c中構建每個對象,並將所有內容鏈接到最後(使用main()函數)。