2011-10-31 59 views
3

要嘗試C++中的C代碼纏繞問題,我使用了以下內容: header.h與包裹一個C++代碼

#ifdef __cplusplus 
extern "C" 
#endif 
void func(); 

source.cpp

#include "header.h" 
#include <iostream> 
extern "C" void func() 
{ 
std::cout << "This is C++ code!" << std::endl; 
} 

和由source.c

#include "header.h" 
int main() 
{ 
func(); 
} 

爲了編譯和鏈接,我用了下面的順序:

g++ -c source.cpp 
gcc source.c source.o -o myprog 

我得到的錯誤是: ENCE到std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)' source.cpp:(.text+0x1c): undefined reference to的std :: basic_ostream> ::操作< <(STD :: basic_ostream> &(*)(STD :: basic_ostream> &))」 source.o :在功能__static_initialization_and_destruction_0(int, int)': source.cpp:(.text+0x45): undefined reference to的std ::的ios_base :: ::初始化的init()」 source.cpp :(文字+ 0x4a):未定義的引用std::ios_base::Init::~Init()' source.o:(.eh_frame+0x12): undefined reference to __gxx_personality_v0' collect2:LD返回1退出狀態

我怎麼能讓這個簡單的代碼編譯並運行?它應該作爲我未來 開發的基礎。

回答

4

鏈路與克++,以及:

g++ -c source.cpp 
g++ source.c source.o -o myprog 

或者更好:

g++ -c source.cpp -o source_cpp.o 
gcc -c source.c -o source_c.o 
g++ -o myprog source_cpp.o source_c.o 

最好避免公共前綴源{CPP,C},因爲它會導致混亂。

+0

謝謝,第一個選項工作:)。如何在一行中執行上述選項1? – user506901

+0

'g ++ -o myprog source.cpp source.c' – trojanfoe

+0

這不會將c源代碼編譯爲C++嗎? – Will03uk

3

你仍然必須用C++鏈接器鏈接:

gcc -o source-c.o source.c 
g++ -o source-p.o source.cpp 
g++ -o myprog source-c.o source-p.o 

你的C++對象文件將需要解決從C++庫,其中僅C++鏈接器會自動拉符號。 (或者,您可以手動爲C鏈接器指定庫。)

0

您不能這樣做,您可以使用gcc編譯C代碼,然後使用g ++將它與C++對象鏈接起來,引用在通過extern關鍵字的C對象,但你不能做相反的

+0

它不僅可能,而且經常使用。這就是爲什麼頭文件系統頭文件中的函數被聲明爲'extern「C」'。唯一不能以這種方式導出的東西是類和對象。 –

+0

@JoachimPileborg:那麼爲什麼你會倒下?你覺得他說什麼? – Hossein