2013-02-12 69 views
3

我創建了一些簡單的基本代碼來說明我的問題。將C++ exe與C庫(GNU)連接起來的麻煩

header.h:

#ifdef __cplusplus 
# define API extern "C" 
#else 
# define API 
#endif 

void callback(); 
API void libFunction(); 

testlib.c:

#include "header.h" 

void libFunction() 
{ 
    Callback(); 
} 

我編譯這是像這樣一個靜態庫:

gcc -c testlib.c 
ar rsc libtest.a testlib.o 

然後我的樣本C++代碼是

main.cpp:

extern "C"{ 
#include <lib/header.h> 
} 
#include <stdio.h> 

main() 
{ 
    libFunction(); 
} 

void Callback() 
{ 
    printf("Callback is called \n"); 
} 

,我嘗試建立我的exe文件,以便

g++ -I. -L. main.cpp -ltest 

,並出現以下錯誤

./lib/libtest.a(testlib.o): In function `libFunction': 
testlib.c:(.text+0x7): undefined reference to `Callback' 
collect2: ld returned 1 exit status 

我花了字面上整天試圖找出原因。任何人都可以幫忙嗎?

回答

3

如果您想從C文件中調用Callback,則需要在您的C++文件中創建extern "C" - 否則C++名稱修改將導致符號不對齊。您需要更改的Callback()的定義main.cpp是:

extern "C" void Callback() 

你有一個不匹配的情況下也。您的標題中的原型爲callback,但在其他地方使用Callback。在重新閱讀你的代碼時,我認爲只要解決這個案例的不匹配問題就可以解決你的所有問題。一讀時我沒有看到圍繞#include <lib/header.h>extern "C"包裝。

+0

嗨,你是正確的案件不匹配,這是我發佈的代碼唯一的問題。我修正了它,現在正在編譯,即使沒有extern。 – 2013-02-12 21:00:04

+0

現在我只需要找出爲什麼我的大「真正」的代碼不鏈接大聲笑,謝謝你的答覆 – 2013-02-12 21:00:30

+0

@BrandonYates - 是的,這是有道理的。我沒有注意到'main.cpp'文件中''include'語句的'extern'C''包裝器。你應該確定只是修理案件。 – 2013-02-12 21:00:53