2012-08-01 64 views
2

我有一個由其他人編寫的C庫,我想從我的C++程序調用。 C頭的結構是這樣的:從C++調用C庫

#ifndef INC_MOVE_CLIENT_H 
#define INC_MOVE_CLIENT_H 

#ifdef __cplusplus 
    extern "C" { 
#endif 

... 

int serverConnect(const char *, const char *, MoveStateDeferred *); 

... 

#ifdef __cplusplus 
} 
#endif 

#endif // ... INC_MOVE_CLIENT_H 

我在我的C調用serverConnect ++程序,像這樣:

#include "helloworld.h" 
#include "moveclient.h" 

int main(int argc, const char* argv[]) { 
    const char* ip = "192.168.1.2"; 
    const char* port = "7899"; 
    MoveStateDeferred* m; 
    serverConnect(ip, port, m); 
} 

這似乎是正確的,以我根據these instructions但是當我嘗試編譯,我得到:

$ gcc helloworld.cpp -o helloworld.out 
/tmp/ccuS93Yu.o: In function `main': 
helloworld.cpp:(.text+0x3c): undefined reference to `serverConnect' 
collect2: ld returned 1 exit status 

moveclient.c執行serverConnect並與其他文件位於同一目錄中。我是否使用不正確的命令進行編譯?有什麼我需要做的,以便moveclient.c編譯以及?還是與編譯commadn無關?

+0

一個重要的事情需要注意的是,如果你不使用'g ++'而不是'gcc'來進行編譯,你可能會得到更多的鏈接錯誤。 – 2012-08-01 05:52:55

+0

請注意,您將傳遞一個未初始化且因此無效的指針作爲serverConnect的第三個參數,MoveStateDeferred *。您需要初始化m以指向有效的MoveStateDeferred,或者更可能的是,將m聲明爲MoveStateDeferred m,然後使用&m作爲serverConnect的第三個參數。 – 2014-06-03 16:02:19

回答

4

編譯命令錯誤。

通常你做這樣的事情:

gcc -c helloworld.cpp -o helloworld.o 
gcc -c moveclient.c -o moveclient.o 
gcc moveclient.o helloworld.o -o helloworld.out 

......這一切的物體連接在一起。

+0

謝謝,這解決了我原來的問題。 – kshen 2012-08-01 06:02:39

3

到目前爲止您所做的一切都正確,但您還需要告訴鏈接器在哪裏可以找到serverConnect的實現。如果您有moveclient.c文件,則:

gcc helloworld.cpp moveclient.c -o helloworld.out 
5

這不是一個編譯問題,它是一個鏈接問題。

假設moveclient.c是你需要的,那麼你有幾種選擇的唯一附加文件:

可以.c文件添加到編輯線:

g++ helloworld.cpp moveclient.c -o helloworld.out 

或者你可以編譯.C (和你的.cpp)文件,目標文件和鏈接它們

g++ -c helloworld.cpp 
gcc -c moveclient.c 
g++ helloworld.o moveclient.o -o helloworld.out 

或者你可以在moveclient東西鏈接到一個庫,該庫添加到鏈接。 創建庫的詳細信息取決於您的系統以及是否需要共享庫或動態庫。但是,一旦你有你的庫構建線看起來就像這樣(假設你的庫被稱爲libmoveclient.solibmoveclient.a)如果你使用的單獨編譯

g++ helloworld.cpp -L. -lmoveclient 

或:

g++ -c helloworld.cpp 
g++ helloworld.o -L. -lmoveclient 
+0

謝謝,這有助於澄清凱文格蘭特的答案。 – kshen 2012-08-01 06:00:21